

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 die Oracle ROWID-Funktionalität zu PostgreSQL auf AWS
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws"></a>

*Rakesh Raghav und Ramesh Pathuri, Amazon Web Services*

## Zusammenfassung
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-summary"></a>

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

In einer Oracle-Datenbank ist die Pseudospalte eine physische Adresse einer Zeile in einer Tabelle`ROWID`. Diese Pseudospalte wird verwendet, um eine Zeile eindeutig zu identifizieren, auch wenn der Primärschlüssel in einer Tabelle nicht vorhanden ist. PostgreSQL hat eine ähnliche Pseudospalte namens`ctid`, aber sie kann nicht als verwendet werden. `ROWID` Wie in der [PostgreSQL-Dokumentation](https://www.postgresql.org/docs/current/ddl-system-columns.html) erklärt, `ctid` kann es sich ändern, wenn es aktualisiert wird oder nach jedem `VACUUM` Prozess.

Es gibt drei Möglichkeiten, die `ROWID` Pseudospaltenfunktionalität in PostgreSQL zu erstellen:
+ Verwenden Sie eine Primärschlüsselspalte, anstatt eine Zeile in einer Tabelle `ROWID` zu identifizieren.
+ Verwenden Sie einen logischen primary/unique Schlü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 primary/unique Schlüssel zum Nachahmen`ROWID`.

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

## Voraussetzungen und Einschränkungen
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-prereqs"></a>

**Voraussetzungen**
+ Ein aktives AWS-Konto
+ Erfahrung in prozeduraler Codierung Language/PostgreSQL (PL/pgSQL)
+ Quelle: Oracle-Datenbank
+ Ein Amazon RDS for PostgreSQL- oder Aurora PostgreSQL-kompatibler Cluster oder eine EC2 Instance zum Hosten der PostgreSQL-Datenbank

**Einschränkungen**
+ Dieses Muster bietet Behelfslösungen für die Funktionalität. `ROWID` PostgreSQL bietet kein Äquivalent zu `ROWID` in Oracle Database.

**Produktversionen**
+ PostgreSQL 11.9 oder höher

## Architektur
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-architecture"></a>

**Quelltechnologie-Stack**
+ Oracle-Datenbank

**Zieltechnologie-Stack**
+ Aurora PostgreSQL-kompatibel, Amazon RDS für PostgreSQL oder eine Instance mit einer PostgreSQL-Datenbank EC2 

![\[Konvertierung einer Oracle-Datenbank nach PostgreSQL auf AWS\]](http://docs.aws.amazon.com/de_de/prescriptive-guidance/latest/patterns/images/pattern-img/9a2ce994-4f68-4975-aab2-796cc20a3c82/images/6e7c2ef6-f440-476a-9003-f1f166718e15.png)


**Implementierungsoptionen**

Es gibt drei Optionen, um die mangelnde `ROWID` Unterstützung in PostgreSQL zu umgehen, 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 | Description | 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 primary/unique Schlüssel** | Wenn Ihre Oracle-Tabelle einen logischen Primärschlüssel hat, 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 erstellen`GENERATED 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 DML-Operationen (Data Manipulation Language) eindeutig zu identifizieren. | Keine Abhängigkeit von proprietären Datenbankfunktionen.Die PostgreSQL-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
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-tools"></a>
+ [Amazon Relational Database Service (Amazon RDS) für PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) unterstützt Sie bei der Einrichtung, dem Betrieb und der Skalierung einer relationalen PostgreSQL-Datenbank in der AWS-Cloud.
+ [Amazon Aurora PostgreSQL-Compatible Edition](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) ist eine vollständig verwaltete, ACID-konforme relationale Datenbank-Engine, die Sie bei der Einrichtung, dem Betrieb und der Skalierung von PostgreSQL-Bereitstellungen unterstützt.
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) ist ein Open-Source-Tool, mit dem Sie über Befehle in Ihrer Befehlszeilen-Shell mit AWS-Services interagieren können. In diesem Muster können Sie die AWS-CLI verwenden, um SQL-Befehle über **pgAdmin** auszuführen.
+ [pgAdmin](https://www.pgadmin.org/) ist ein Open-Source-Verwaltungstool für PostgreSQL. Es bietet eine grafische Oberfläche, mit der Sie Datenbankobjekte erstellen, verwalten und verwenden können.
+ Das [AWS Schema Conversion Tool (AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html) unterstützt heterogene Datenbankmigrationen, indem das Quelldatenbankschema und ein Großteil des benutzerdefinierten Codes automatisch in ein Format konvertiert werden, das mit der Zieldatenbank kompatibel ist.

## Epen
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-epics"></a>

### Identifizieren Sie die Quelltabellen
<a name="identify-the-source-tables"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Identifizieren Sie Oracle-Tabellen, die das `ROWID` Attribut verwenden. | Verwenden Sie das AWS Schema Conversion Tool (AWS SCT), um Oracle-Tabellen zu identifizieren, die über `ROWID` Funktionen verfügen. Weitere Informationen finden Sie in der [AWS SCT-Dokumentation](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.Oracle.ToPostgreSQL.html#CHAP_Source.Oracle.ToPostgreSQL.ConvertRowID). –oder –Verwenden Sie in Oracle die `DBA_TAB_COLUMNS` Ansicht, um Tabellen mit einem `ROWID` Attribut zu identifizieren. 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. | DBA oder Entwickler | 
| Identifizieren Sie den Code, der auf diese Tabellen verweist. | Verwenden Sie AWS SCT, um einen Migrationsbewertungsbericht zu erstellen, um die Verfahren zu identifizieren, die betroffen sind von`ROWID`. Weitere Informationen finden Sie in der [AWS SCT-Dokumentation](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_AssessmentReport.html). –oder –Verwenden Sie in der Oracle-Quelldatenbank das Textfeld der `dba_source` Tabelle, um Objekte zu identifizieren, die `ROWID` Funktionen verwenden. | DBA oder Entwickler | 

### Ermitteln Sie die Verwendung von Primärschlüsseln
<a name="determine-primary-key-usage"></a>


| Aufgabe | Description | Erforderliche 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. Beispiel:<pre>select dt.*<br />from dba_tables dt<br />where not exists (select 1<br />                  from all_constraints ct<br />                  where ct.owner = Dt.owner<br />                    and ct.table_name = Dt.table_name<br />                    and ct.constraint_type = 'P'<br />                  )<br />and dt.owner = '{schema}'</pre> | DBA oder Entwickler | 

### Identifizieren Sie die Lösung und wenden Sie sie an
<a name="identify-and-apply-the-solution"></a>


| Aufgabe | Description | 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](#migrate-oracle-rowid-functionality-to-postgresql-on-aws-additional) 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. | DBA oder 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`GENERATED ALWAYS AS IDENTITY`. Nehmen Sie die Änderungen an der Anwendung und dem Datenbankcode vor, die im Abschnitt [Zusätzliche Informationen](#migrate-oracle-rowid-functionality-to-postgresql-on-aws-additional) aufgeführt sind. | DBA oder 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. | DBA oder Entwickler | 

## Zugehörige Ressourcen
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-resources"></a>
+ [PostgreSQL CTID (PostgreSQL-Dokumentation](https://www.postgresql.org/docs/current/ddl-system-columns.html))
+ [Generierte Spalten](https://www.postgresql.org/docs/current/ddl-generated-columns.html) (PostgreSQL-Dokumentation)
+ [ROWID-Pseudospalte (](https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ROWID-Pseudocolumn.html#GUID-F6E0FBD2-983C-495D-9856-5E113A17FAF1)Oracle-Dokumentation)

## Zusätzliche Informationen
<a name="migrate-oracle-rowid-functionality-to-postgresql-on-aws-additional"></a>

Die folgenden Abschnitte enthalten Oracle- und PostgreSQL-Codebeispiele, um die drei Ansätze zu veranschaulichen.

**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
```

*PostgreSQL-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` `emp_id` als 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
```

*PostgreSQL-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
```

*PostgreSQL-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
```