

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 virtuell generierte Spalten von Oracle nach PostgreSQL
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql"></a>

*Veeranjaneyulu Grandhi, Rajesh Madiwale und Ramesh Pathuri, Amazon Web Services*

## Zusammenfassung
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-summary"></a>

In Version 11 und früher bietet PostgreSQL keine Funktion, die direkt einer virtuellen Oracle-Spalte entspricht. Der Umgang mit virtuell generierten Spalten bei der Migration von Oracle Database zu PostgreSQL Version 11 oder früher ist aus zwei Gründen schwierig: 
+ Virtuelle Spalten sind während der Migration nicht sichtbar.
+ PostgreSQL unterstützt den `generate` Ausdruck vor Version 12 nicht.

Es gibt jedoch Problemumgehungen, um ähnliche Funktionen zu emulieren. Wenn Sie AWS Database Migration Service (AWS DMS) verwenden, um Daten von Oracle Database zu PostgreSQL Version 11 und früher zu migrieren, können Sie Triggerfunktionen verwenden, um die Werte in virtuell generierten Spalten aufzufüllen. Dieses Muster enthält Beispiele für Oracle-Datenbank- und PostgreSQL-Code, den Sie für diesen Zweck verwenden können. Auf AWS können Sie Amazon Relational Database Service (Amazon RDS) für PostgreSQL oder Amazon Aurora PostgreSQL-Compatible Edition für Ihre PostgreSQL-Datenbank verwenden.

Ab PostgreSQL Version 12 werden generierte Spalten unterstützt. Generierte Spalten können entweder spontan aus anderen Spaltenwerten berechnet oder berechnet und gespeichert werden. [Von PostgreSQL generierte Spalten](https://www.postgresql.org/docs/12/ddl-generated-columns.html) ähneln virtuellen Oracle-Spalten.

## Voraussetzungen und Einschränkungen
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-prereqs"></a>

**Voraussetzungen**
+ Ein aktives AWS-Konto
+ Eine Oracle-Quelldatenbank 
+ PostgreSQL-Zieldatenbanken (auf Amazon RDS für PostgreSQL oder Aurora PostgreSQL-kompatibel)
+ [Erfahrung in der PL/PgSQL-Codierung](https://www.postgresql.org/docs/current/plpgsql.html)

**Einschränkungen**
+ Gilt nur für PostgreSQL-Versionen vor Version 12. 
+ Gilt für Oracle Database Version 11g oder höher.
+ Virtuelle Spalten werden in Datenmigrationstools nicht unterstützt.
+ Gilt nur für Spalten, die in derselben Tabelle definiert sind.
+ Wenn sich eine virtuell generierte Spalte auf eine deterministische benutzerdefinierte Funktion bezieht, kann sie nicht als Partitionierungsschlüsselspalte verwendet werden.
+ Die Ausgabe des Ausdrucks muss ein Skalarwert sein. Es kann keinen von Oracle angegebenen Datentyp, einen benutzerdefinierten Typ, oder zurückgeben. `LOB` `LONG RAW`
+ Indizes, die für virtuelle Spalten definiert sind, entsprechen funktionsbasierten Indizes in PostgreSQL.
+ Tabellenstatistiken müssen gesammelt werden.

## Tools
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-tools"></a>
+ [pgAdmin 4](https://www.pgadmin.org/) ist ein Open-Source-Verwaltungstool für PostgreSQL. Dieses Tool bietet eine grafische Oberfläche, die die Erstellung, Wartung und Verwendung von Datenbankobjekten vereinfacht.
+ [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) ist eine kostenlose, integrierte Entwicklungsumgebung für die Arbeit mit SQL in Oracle-Datenbanken sowohl in herkömmlichen als auch in Cloud-Umgebungen. 

## Epen
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-epics"></a>

### Erstellen Sie Quell- und Zieldatenbanktabellen
<a name="create-source-and-target-database-tables"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie eine Oracle-Datenbankquelltabelle. | Erstellen Sie in Oracle Database eine Tabelle mit virtuell generierten Spalten, indem Sie die folgende Anweisung verwenden.<pre>CREATE TABLE test.generated_column<br />( CODE NUMBER,<br />STATUS VARCHAR2(12) DEFAULT 'PreOpen',<br />FLAG CHAR(1) GENERATED ALWAYS AS (CASE UPPER(STATUS) WHEN 'OPEN' THEN 'N' ELSE 'Y' END) VIRTUAL VISIBLE<br />);</pre><br />In dieser Quelltabelle werden die Daten in der `STATUS` Spalte über AWS DMS in die Zieldatenbank migriert. Die `FLAG` Spalte wird jedoch mithilfe von `generate by` Funktionen gefüllt, sodass diese Spalte für AWS DMS während der Migration nicht sichtbar ist. Um die Funktionalität von zu implementieren`generated by`, müssen Sie Trigger und Funktionen in der Zieldatenbank verwenden, um die Werte in der `FLAG` Spalte aufzufüllen, wie im nächsten Epic gezeigt. | DBA, App-Entwickler | 
| Erstellen Sie eine PostgreSQL-Zieltabelle auf AWS. | Erstellen Sie mithilfe der folgenden Anweisung eine PostgreSQL-Tabelle auf AWS.<pre>CREATE TABLE test.generated_column<br />(<br />    code integer not null,<br />    status character varying(12) not null ,<br />    flag character(1)<br />);</pre><br />In dieser Tabelle ist die `status` Spalte eine Standardspalte. Bei der `flag` Spalte handelt es sich um eine generierte Spalte, die auf den Daten in der `status` Spalte basiert. | DBA, App-Entwickler | 

### Erstellen Sie eine Triggerfunktion zur Behandlung der virtuellen Spalte in PostgreSQL
<a name="create-a-trigger-function-to-handle-the-virtual-column-in-postgresql"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie einen PostgreSQL-Trigger. | Erstellen Sie in PostgreSQL einen Trigger.<pre>CREATE TRIGGER tgr_gen_column<br />AFTER INSERT OR UPDATE OF status ON test.generated_column<br />FOR EACH ROW <br />EXECUTE FUNCTION test.tgf_gen_column();</pre> | DBA, App-Entwickler | 
| Erstellen Sie eine PostgreSQL-Triggerfunktion. | Erstellen Sie in PostgreSQL eine Funktion für den Trigger. Diese Funktion füllt eine virtuelle Spalte, die von der Anwendung oder AWS DMS eingefügt oder aktualisiert wird, und validiert die Daten.<pre>CREATE OR REPLACE FUNCTION test.tgf_gen_column() RETURNS trigger AS $VIRTUAL_COL$<br />BEGIN<br />IF (TG_OP = 'INSERT') THEN<br />IF (NEW.flag IS NOT NULL) THEN<br />RAISE EXCEPTION 'ERROR: cannot insert into column "flag"' USING DETAIL = 'Column "flag" is a generated column.';<br />END IF;<br />END IF;<br />IF (TG_OP = 'UPDATE') THEN<br />IF (NEW.flag::VARCHAR != OLD.flag::varchar) THEN<br />RAISE EXCEPTION 'ERROR: cannot update column "flag"' USING DETAIL = 'Column "flag" is a generated column.';<br />END IF;<br />END IF;<br />IF TG_OP IN ('INSERT','UPDATE') THEN<br />IF (old.flag is NULL) OR (coalesce(old.status,'') != coalesce(new.status,'')) THEN<br />UPDATE test.generated_column<br />SET flag = (CASE UPPER(status) WHEN 'OPEN' THEN 'N' ELSE 'Y' END)<br />WHERE code = new.code;<br />END IF;<br />END IF;<br />RETURN NEW;<br />END<br />$VIRTUAL_COL$ LANGUAGE plpgsql;</pre> | DBA, App-Entwickler | 

### Testen Sie die Datenmigration mithilfe von AWS DMS
<a name="test-data-migration-by-using-aws-dms"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie eine Replikationsinstanz. | Folgen Sie den [Anweisungen](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Creating.html) in der AWS DMS-Dokumentation, um eine Replikationsinstanz zu erstellen. Die Replikationsinstanz sollte sich in derselben Virtual Private Cloud (VPC) wie Ihre Quell- und Zieldatenbanken befinden. | DBA, App-Entwickler | 
| Erstellen Sie Quell- und Zielendpunkte. | Folgen Sie den [Anweisungen](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.Creating.html) in der AWS DMS-Dokumentation, um die Endpoints zu erstellen. | DBA, App-Entwickler | 
| Testen Sie die Endpunktverbindungen. | Sie können die Endpunktverbindungen testen, indem Sie die VPC und die Replikationsinstanz angeben und **Test ausführen** wählen. | DBA, App-Entwickler | 
| Erstellen und starten Sie eine Vollladeaufgabe. | Anweisungen finden Sie in der AWS DMS-Dokumentation unter Aufgaben [erstellen und Aufgabeneinstellungen](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html) [unter Vollladen](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.html). | DBA, App-Entwickler | 
| Überprüfen Sie die Daten für die virtuelle Spalte. | Vergleichen Sie die Daten in der virtuellen Spalte in der Quell- und Zieldatenbank. Sie können die Daten manuell validieren oder ein Skript für diesen Schritt schreiben. | DBA, App-Entwickler | 

## Zugehörige Ressourcen
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-resources"></a>
+ [Erste Schritte mit AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_GettingStarted.html) (AWS DMS-Dokumentation)
+ [Verwenden einer Oracle-Datenbank als Quelle für AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html) (AWS DMS-Dokumentation)
+ [Verwenden einer PostgreSQL-Datenbank als Ziel für AWS DMS (AWS DMS-Dokumentation](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html))
+ [Generierte Spalten in PostgreSQL (PostgreSQL-Dokumentation](https://www.postgresql.org/docs/12/ddl-generated-columns.html))
+ [Triggerfunktionen](https://www.postgresql.org/docs/12/plpgsql-trigger.html) (PostgreSQL-Dokumentation)
+ [Virtuelle Spalten](https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#SQLRF01402) in der Oracle-Datenbank (Oracle-Dokumentation)