

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Migrer les colonnes générées virtuellement d'Oracle vers PostgreSQL
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql"></a>

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

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

Dans les versions 11 et antérieures, PostgreSQL ne fournit aucune fonctionnalité directement équivalente à une colonne virtuelle Oracle. La gestion des colonnes générées virtuelles lors de la migration d'Oracle Database vers PostgreSQL version 11 ou antérieure est difficile pour deux raisons : 
+ Les colonnes virtuelles ne sont pas visibles pendant la migration.
+ PostgreSQL ne prend pas en charge l'expression avant `generate` la version 12.

Cependant, il existe des solutions pour émuler des fonctionnalités similaires. Lorsque vous utilisez AWS Database Migration Service (AWS DMS) pour migrer des données d'Oracle Database vers PostgreSQL version 11 ou antérieure, vous pouvez utiliser des fonctions de déclenchement pour renseigner les valeurs dans les colonnes générées virtuellement. Ce modèle fournit des exemples de code Oracle Database et PostgreSQL que vous pouvez utiliser à cette fin. Sur AWS, vous pouvez utiliser Amazon Relational Database Service (Amazon RDS) pour PostgreSQL ou Amazon Aurora PostgreSQL Compatible Edition pour votre base de données PostgreSQL.

À partir de la version 12 de PostgreSQL, les colonnes générées sont prises en charge. Les colonnes générées peuvent être calculées à partir d'autres valeurs de colonne à la volée ou calculées et stockées. Les colonnes [générées par PostgreSQL](https://www.postgresql.org/docs/12/ddl-generated-columns.html) sont similaires aux colonnes virtuelles Oracle.

## Conditions préalables et limitations
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-prereqs"></a>

**Conditions préalables**
+ Un compte AWS actif
+ Une base de données Oracle source 
+ Bases de données PostgreSQL cibles (sur Amazon RDS for PostgreSQL ou compatible avec Aurora PostgreSQL)
+ [Expertise en codage PL/pgSQL](https://www.postgresql.org/docs/current/plpgsql.html)

**Limites**
+ S'applique uniquement aux versions de PostgreSQL antérieures à la version 12. 
+ S'applique à la version 11g ou ultérieure d'Oracle Database.
+ Les colonnes virtuelles ne sont pas prises en charge dans les outils de migration de données.
+ S'applique uniquement aux colonnes définies dans le même tableau.
+ Si une colonne générée virtuelle fait référence à une fonction déterministe définie par l'utilisateur, elle ne peut pas être utilisée comme colonne clé de partitionnement.
+ La sortie de l'expression doit être une valeur scalaire. Il ne peut pas renvoyer un type de données fourni par Oracle, un type défini par l'utilisateur, `LOB` ou. `LONG RAW`
+ Les index définis par rapport à des colonnes virtuelles sont équivalents aux index basés sur des fonctions dans PostgreSQL.
+ Les statistiques du tableau doivent être collectées.

## Outils
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-tools"></a>
+ [pgAdmin](https://www.pgadmin.org/) 4 est un outil de gestion open source pour PostgreSQL. Cet outil fournit une interface graphique qui simplifie la création, la maintenance et l'utilisation des objets de base de données.
+ [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) est un environnement de développement intégré gratuit permettant de travailler avec SQL dans les bases de données Oracle dans le cadre de déploiements traditionnels et dans le cloud. 

## Épopées
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-epics"></a>

### Création de tables de base de données source et cible
<a name="create-source-and-target-database-tables"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez une table de base de données Oracle source. | Dans Oracle Database, créez une table avec des colonnes générées virtuellement à l'aide de l'instruction suivante.<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 />Dans ce tableau source, les données de la `STATUS` colonne sont migrées via AWS DMS vers la base de données cible. La `FLAG` colonne est toutefois remplie à l'aide de `generate by` fonctionnalités. Elle n'est donc pas visible par AWS DMS pendant la migration. Pour implémenter la fonctionnalité de`generated by`, vous devez utiliser des déclencheurs et des fonctions dans la base de données cible pour renseigner les valeurs de la `FLAG` colonne, comme indiqué dans l'épopée suivante. | DBA, développeur d'applications | 
| Créez une table PostgreSQL cible sur AWS. | Créez une table PostgreSQL sur AWS à l'aide de l'instruction suivante.<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 />Dans ce tableau, la `status` colonne est une colonne standard. La `flag` colonne sera une colonne générée en fonction des données qu'elle `status` contient. | DBA, développeur d'applications | 

### Créez une fonction de déclenchement pour gérer la colonne virtuelle dans PostgreSQL
<a name="create-a-trigger-function-to-handle-the-virtual-column-in-postgresql"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez un déclencheur PostgreSQL. | Dans PostgreSQL, créez un déclencheur.<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, développeur d'applications | 
| Créez une fonction de déclenchement PostgreSQL. | Dans PostgreSQL, créez une fonction pour le déclencheur. Cette fonction remplit une colonne virtuelle insérée ou mise à jour par l'application ou AWS DMS, et valide les données.<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, développeur d'applications | 

### Testez la migration des données à l'aide d'AWS DMS
<a name="test-data-migration-by-using-aws-dms"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez une instance de réplication. | Pour créer une instance de réplication, suivez les [instructions](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Creating.html) de la documentation AWS DMS. L'instance de réplication doit se trouver dans le même cloud privé virtuel (VPC) que vos bases de données source et cible. | DBA, développeur d'applications | 
| Créez des points de terminaison source et cible. | Pour créer les points de terminaison, suivez les [instructions](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.Creating.html) de la documentation AWS DMS. | DBA, développeur d'applications | 
| Testez les connexions du point de terminaison. | Vous pouvez tester les connexions du point de terminaison en spécifiant le VPC et l'instance de réplication, puis en choisissant **Run** test. | DBA, développeur d'applications | 
| Créez et lancez une tâche de chargement complet. | Pour obtenir des instructions, consultez les [sections Création d'une tâche](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html) et [Chargement complet de la tâche](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.html) dans la documentation AWS DMS. | DBA, développeur d'applications | 
| Validez les données de la colonne virtuelle. | Comparez les données de la colonne virtuelle dans les bases de données source et cible. Vous pouvez valider les données manuellement ou écrire un script pour cette étape. | DBA, développeur d'applications | 

## Ressources connexes
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-resources"></a>
+ [Mise en route avec AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_GettingStarted.html) (documentation AWS DMS)
+ [Utilisation d'une base de données Oracle comme source pour AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html) (documentation AWS DMS)
+ [Utilisation d'une base de données PostgreSQL comme cible pour AWS DMS (documentation AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html))
+ [Colonnes générées dans PostgreSQL](https://www.postgresql.org/docs/12/ddl-generated-columns.html) (documentation PostgreSQL)
+ [Fonctions de déclenchement](https://www.postgresql.org/docs/12/plpgsql-trigger.html) (documentation PostgreSQL)
+ [Colonnes virtuelles](https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#SQLRF01402) dans la base de données Oracle (documentation Oracle)