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-Dokumentationctid
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 zuROWID
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
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. |
|
|
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. |
|
|
Identitätsattribut | Wenn Ihre Oracle-Tabelle keinen Primärschlüssel hat, können Sie ein zusätzliches Feld als erstellen |
|
|
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
pgAdmin
ist 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
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Identifizieren Sie Oracle-Tabellen, die das | Verwenden Sie das AWS Schema Conversion Tool (AWSSCT), um Oracle-Tabellen zu identifizieren, die über –oder– Verwenden Sie in Oracle die | 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 von –oder– Verwenden Sie in der Oracle-Quelldatenbank das Textfeld der | DBAoder Entwickler |
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Identifizieren Sie Tabellen, die keine Primärschlüssel haben. | Verwenden Sie dies in der Oracle-Quelldatenbank,
| DBAoder Entwickler |
Aufgabe | Beschreibung | Erforderliche 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 hinzu | 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
Postgre SQL CTID
(Postgre-DokumentationSQL) Generierte Spalten
(SQLPostgre-Dokumentation)
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