Migrieren Sie ROWID Oracle-Funktionen auf Postgre SQL AWS - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Migrieren Sie ROWID Oracle-Funktionen auf Postgre SQL AWS

Erstellt von Rakesh Raghav (AWS) und Ramesh Pathuri () AWS

Umgebung: PoC oder Pilotprojekt

Quelle: Oracle-Datenbank

Ziel: SQL Postgre-Datenbank auf AWS

R-Typ: Replatform

Arbeitslast: Oracle

Technologien: Migration; Datenbanken

AWSDienstleistungen: Amazon Aurora; Amazon RDS AWSSCT; AWS CLI

Übersicht

Dieses Muster beschreibt Optionen für die Migration der ROWID Pseudospaltenfunktionalität in Oracle Database zu einer Postgre-Datenbank in Amazon Relational SQL Database Service (AmazonRDS) for PostgreSQL, Amazon Aurora Postgre SQL -Compatible Edition oder Amazon Elastic Compute Cloud (Amazon). EC2

In einer Oracle-Datenbank ist die ROWID Pseudospalte eine physische Adresse einer Zeile in einer Tabelle. Diese Pseudospalte wird verwendet, um eine Zeile eindeutig zu identifizieren, auch wenn der Primärschlüssel in einer Tabelle nicht vorhanden ist. Postgre SQL hat eine ähnliche Pseudospalte namensctid, sie kann jedoch nicht als verwendet werden. ROWID Wie in der SQLPostgre-Dokumentation erklärt, ctid kann es sich ändern, wenn es aktualisiert wird oder nach jedem Prozess. VACUUM

Es gibt drei Möglichkeiten, die ROWID Pseudospaltenfunktionalität in Postgre zu erstellen: SQL

  • Verwenden Sie eine Primärschlüsselspalte, anstatt eine Zeile in einer Tabelle ROWID zu identifizieren.

  • Verwenden Sie einen logischen Primär-/Einzelschlüssel (der ein zusammengesetzter Schlüssel sein kann) in der Tabelle. 

  • Fügen Sie eine Spalte mit automatisch generierten Werten hinzu und machen Sie sie zu einem primären/eindeutigen Schlüssel, der nachgeahmt werden soll. ROWID

Dieses Muster führt Sie durch alle drei Implementierungen und beschreibt die Vor- und Nachteile der einzelnen Optionen.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives Konto AWS

  • Programmierkenntnisse in prozeduraler Sprache/Postgre-Programmierung SQL (SQLPL/PG)

  • Quelle: Oracle-Datenbank

  • Ein Amazon RDS for Postgre SQL - oder Aurora SQL Postgre-kompatibler Cluster oder eine EC2 Instance zum Hosten der Postgre-Datenbank SQL

Einschränkungen

  • Dieses Muster bietet Behelfslösungen für die Funktionalität. ROWID Postgre bietet SQL kein Äquivalent zu ROWID in Oracle Database.

Produktversionen

  • Postgre SQL 11.9 oder höher

Architektur

Quelltechnologie-Stack

  • Oracle Database

Zieltechnologie-Stack

  • Aurora SQL Postgre-Compatible, Amazon RDS for Postgre SQL oder eine EC2 Instance mit einer Postgre-Datenbank SQL

Konvertierung einer Oracle-Datenbank nach Postgre am SQL AWS

Implementierungsoptionen

Es gibt drei Optionen, um die mangelnde ROWID Unterstützung in Postgre zu umgehenSQL, je nachdem, ob Ihre Tabelle einen Primärschlüssel oder einen eindeutigen Index, einen logischen Primärschlüssel oder ein Identitätsattribut hat. Ihre Wahl hängt von Ihren Projektzeitplänen, Ihrer aktuellen Migrationsphase und den Abhängigkeiten von Anwendungs- und Datenbankcode ab.

Option

Beschreibung

Vorteile

Nachteile

Primärschlüssel oder eindeutiger Index

Wenn Ihre Oracle-Tabelle über einen Primärschlüssel verfügt, können Sie die Attribute dieses Schlüssels verwenden, um eine Zeile eindeutig zu identifizieren. 

  • Keine Abhängigkeit von proprietären Datenbankfunktionen.

  • Minimale Auswirkungen auf die Leistung, da Primärschlüsselfelder indexiert werden.

  • Erfordert Änderungen am Anwendungs- und Datenbankcode, der ROWID für den Wechsel zu Primärschlüsselfeldern erforderlich ist.

 

Logischer Primär-/Einzelschlüssel

Wenn Ihre Oracle-Tabelle über einen logischen Primärschlüssel verfügt, können Sie die Attribute dieses Schlüssels verwenden, um eine Zeile eindeutig zu identifizieren. Ein logischer Primärschlüssel besteht aus einem Attribut oder einer Gruppe von Attributen, die eine Zeile eindeutig identifizieren können, aber dieser Wert wird in der Datenbank nicht durch eine Einschränkung erzwungen.

  • Keine Abhängigkeit von proprietären Datenbankfunktionen.

  • Erfordert Änderungen am Anwendungs- und Datenbankcode, der ROWID für den Wechsel zu Primärschlüsselfeldern erforderlich ist.

  • Erhebliche Auswirkung auf die Leistung, wenn die Attribute des logischen Primärschlüssels nicht indexiert werden. Sie können jedoch einen eindeutigen Index hinzufügen, um Leistungsprobleme zu vermeiden.

Identitätsattribut

Wenn Ihre Oracle-Tabelle keinen Primärschlüssel hat, können Sie ein zusätzliches Feld als erstellenGENERATED ALWAYS AS IDENTITY. Dieses Attribut generiert immer dann einen eindeutigen Wert, wenn Daten in die Tabelle eingefügt werden, sodass es verwendet werden kann, um eine Zeile für Data Manipulation Language (DML) -Operationen eindeutig zu identifizieren.

  • Keine Abhängigkeit von proprietären Datenbankfunktionen.

  • Die SQL Postgre-Datenbank füllt das Attribut auf und behält seine Einzigartigkeit bei.

  • Erfordert Änderungen am Anwendungs- und Datenbankcode, der für den Wechsel ROWID zum Identitätsattribut erforderlich ist.

  • Erhebliche Auswirkung auf die Leistung, wenn das zusätzliche Feld nicht indexiert wird. Sie können jedoch einen Index hinzufügen, um Leistungsprobleme zu vermeiden.

Tools

  • Amazon Relational Database Service (AmazonRDS) for Postgre SQL unterstützt Sie bei der Einrichtung, dem Betrieb und der Skalierung einer SQL relationalen Postgre-Datenbank in der Cloud. AWS

  • Amazon Aurora SQL Postgre-Compatible Edition ist eine vollständig verwaltete, ACID konforme relationale Datenbank-Engine, die Sie bei der Einrichtung, dem Betrieb und der Skalierung von Postgre-Bereitstellungen unterstützt. SQL

  • AWSDie Befehlszeilenschnittstelle (AWSCLI) ist ein Open-Source-Tool, mit dem Sie mithilfe von Befehlen in Ihrer Befehlszeilen-Shell mit AWS Diensten interagieren können. In diesem Muster können Sie die verwenden, AWS CLI um Befehle auszuführenSQL. pgAdmin

  • pgAdminist ein Open-Source-Verwaltungstool für SQL Postgre. Es bietet eine grafische Oberfläche, mit der Sie Datenbankobjekte erstellen, verwalten und verwenden können.

  • AWSDas Schema Conversion Tool (AWSSCT) unterstützt heterogene Datenbankmigrationen, indem es das Quelldatenbankschema und einen Großteil des benutzerdefinierten Codes automatisch in ein Format konvertiert, das mit der Zieldatenbank kompatibel ist.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Identifizieren Sie Oracle-Tabellen, die das ROWID Attribut verwenden.

Verwenden Sie das AWS Schema Conversion Tool (AWSSCT), um Oracle-Tabellen zu identifizieren, die über ROWID Funktionen verfügen. Weitere Informationen finden Sie in der AWSSCTDokumentation.

–oder–

Verwenden Sie in Oracle die DBA_TAB_COLUMNS Ansicht, um Tabellen zu identifizieren, die über ein ROWID Attribut verfügen. Diese Felder können zum Speichern von alphanumerischen 10-Byte-Zeichen verwendet werden. Ermitteln Sie die Verwendung und konvertieren Sie diese gegebenenfalls in ein VARCHAR Feld.

DBAoder Entwickler

Identifizieren Sie den Code, der auf diese Tabellen verweist.

Wird verwendet AWSSCT, um einen Migrationsbewertungsbericht zu erstellen, um die Verfahren zu identifizieren, die betroffen sind vonROWID. Weitere Informationen finden Sie in der AWSSCTDokumentation.

–oder–

Verwenden Sie in der Oracle-Quelldatenbank das Textfeld der dba_source Tabelle, um Objekte zu identifizieren, die ROWID Funktionen verwenden.

DBAoder Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Identifizieren Sie Tabellen, die keine Primärschlüssel haben.

Verwenden Sie dies in der Oracle-Quelldatenbank, DBA_CONSTRAINTS um Tabellen zu identifizieren, die keine Primärschlüssel haben. Anhand dieser Informationen können Sie die Strategie für jede Tabelle festlegen. Beispielsweise:

select dt.* from dba_tables dt where not exists (select 1 from all_constraints ct where ct.owner = Dt.owner and ct.table_name = Dt.table_name and ct.constraint_type = 'P' ) and dt.owner = '{schema}'
DBAoder Entwickler
AufgabeBeschreibungErforderliche Fähigkeiten

Wenden Sie Änderungen für Tabellen an, die einen definierten oder logischen Primärschlüssel haben.

Nehmen Sie die im Abschnitt Zusätzliche Informationen aufgeführten Änderungen am Anwendungs- und Datenbankcode vor, um einen eindeutigen Primärschlüssel oder einen logischen Primärschlüssel zur Identifizierung einer Zeile in Ihrer Tabelle zu verwenden.

DBAoder Entwickler

Fügen Sie Tabellen, die keinen definierten oder logischen Primärschlüssel haben, ein zusätzliches Feld hinzu.

Fügen Sie ein Attribut des Typs hinzuGENERATED ALWAYS AS IDENTITY. Nehmen Sie die Änderungen an der Anwendung und dem Datenbankcode vor, die im Abschnitt Zusätzliche Informationen aufgeführt sind.

DBAoder Entwickler

Fügen Sie bei Bedarf einen Index hinzu.

Fügen Sie dem zusätzlichen Feld oder dem logischen Primärschlüssel einen Index hinzu, um die SQL Leistung zu verbessern.

DBAoder Entwickler

Zugehörige Ressourcen

Zusätzliche Informationen

Die folgenden Abschnitte enthalten Oracle- und SQL Postgre-Codebeispiele zur Veranschaulichung der drei Ansätze.

Szenario 1: Verwendung eines eindeutigen Primärschlüssels

In den folgenden Beispielen erstellen Sie die Tabelle testrowid_s1 mit emp_id als Primärschlüssel.

Oracle-Code:

create table testrowid_s1 (emp_id integer, name varchar2(10), CONSTRAINT testrowid_pk PRIMARY KEY (emp_id)); INSERT INTO testrowid_s1(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s1(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s1(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s1(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 empname2 AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4 UPDATE testrowid_s1 SET name = 'Ramesh' WHERE rowid = 'AAAF3pAAAAAAAMOAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s1; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3pAAAAAAAMOAAA 1 empname1 AAAF3pAAAAAAAMOAAB 2 Ramesh AAAF3pAAAAAAAMOAAC 3 empname3 AAAF3pAAAAAAAMOAAD 4 empname4

SQLPostgre-Code:

CREATE TABLE public.testrowid_s1 ( emp_id integer, name character varying, primary key (emp_id) ); insert into public.testrowid_s1 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s1 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s1; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh

Szenario 2: Verwendung eines logischen Primärschlüssels

In den folgenden Beispielen erstellen Sie die Tabelle testrowid_s2 mit emp_id dem logischen Primärschlüssel.

Oracle-Code:

create table testrowid_s2 (emp_id integer, name varchar2(10) ); INSERT INTO testrowid_s2(emp_id,name) values (1,'empname1'); INSERT INTO testrowid_s2(emp_id,name) values (2,'empname2'); INSERT INTO testrowid_s2(emp_id,name) values (3,'empname3'); INSERT INTO testrowid_s2(emp_id,name) values (4,'empname4'); commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 empname2 AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4 UPDATE testrowid_s2 SET name = 'Ramesh' WHERE rowid = 'AAAF3rAAAAAAAMeAAB' ; commit; SELECT rowid,emp_id,name FROM testrowid_s2; ROWID EMP_ID NAME ------------------ ---------- ---------- AAAF3rAAAAAAAMeAAA 1 empname1 AAAF3rAAAAAAAMeAAB 2 Ramesh AAAF3rAAAAAAAMeAAC 3 empname3 AAAF3rAAAAAAAMeAAD 4 empname4

SQLPostgre-Code:

CREATE TABLE public.testrowid_s2 ( emp_id integer, name character varying ); insert into public.testrowid_s2 (emp_id,name) values (1,'empname1'),(2,'empname2'),(3,'empname3'),(4,'empname4'); select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s2 set name = 'Ramesh' where emp_id = 2 ; select emp_id,name from testrowid_s2; emp_id | name --------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh

Szenario 3: Verwendung eines Identitätsattributs

In den folgenden Beispielen erstellen Sie die Tabelle testrowid_s3 ohne Primärschlüssel und mithilfe eines Identitätsattributs.

Oracle-Code:

create table testrowid_s3 (name varchar2(10)); INSERT INTO testrowid_s3(name) values ('empname1'); INSERT INTO testrowid_s3(name) values ('empname2'); INSERT INTO testrowid_s3(name) values ('empname3'); INSERT INTO testrowid_s3(name) values ('empname4'); commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB empname2 AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4 UPDATE testrowid_s3 SET name = 'Ramesh' WHERE rowid = 'AAAF3sAAAAAAAMmAAB' ; commit; SELECT rowid,name FROM testrowid_s3; ROWID NAME ------------------ ---------- AAAF3sAAAAAAAMmAAA empname1 AAAF3sAAAAAAAMmAAB Ramesh AAAF3sAAAAAAAMmAAC empname3 AAAF3sAAAAAAAMmAAD empname4

SQLPostgre-Code:

CREATE TABLE public.testrowid_s3 ( rowid_seq bigint generated always as identity, name character varying ); insert into public.testrowid_s3 (name) values ('empname1'),('empname2'),('empname3'),('empname4'); select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 2 | empname2 3 | empname3 4 | empname4 update testrowid_s3 set name = 'Ramesh' where rowid_seq = 2 ; select rowid_seq,name from testrowid_s3; rowid_seq | name -----------+---------- 1 | empname1 3 | empname3 4 | empname4 2 | Ramesh