

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Migra le colonne virtuali generate da Oracle a PostgreSQL
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql"></a>

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

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

Nella versione 11 e precedenti, PostgreSQL non fornisce una funzionalità direttamente equivalente a una colonna virtuale Oracle. La gestione delle colonne virtuali generate durante la migrazione da Oracle Database a PostgreSQL versione 11 o precedente è difficile per due motivi: 
+ Le colonne virtuali non sono visibili durante la migrazione.
+ PostgreSQL non supporta `generate` l'espressione prima della versione 12.

Tuttavia, esistono soluzioni alternative per emulare funzionalità simili. Quando utilizzi AWS Database Migration Service (AWS DMS) per migrare i dati da Oracle Database a PostgreSQL versione 11 e precedenti, puoi utilizzare le funzioni di attivazione per popolare i valori in colonne virtuali generate. Questo modello fornisce esempi di codice Oracle Database e PostgreSQL che è possibile utilizzare per questo scopo. Su AWS, puoi utilizzare Amazon Relational Database Service (Amazon RDS) per PostgreSQL o Amazon Aurora PostgreSQL Compatible Edition per il tuo database PostgreSQL.

A partire dalla versione 12 di PostgreSQL, sono supportate le colonne generate. Le colonne generate possono essere calcolate istantaneamente in base ai valori di altre colonne oppure calcolate e archiviate. [Le colonne generate da PostgreSQL sono simili alle colonne virtuali](https://www.postgresql.org/docs/12/ddl-generated-columns.html) Oracle.

## Prerequisiti e limitazioni
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-prereqs"></a>

**Prerequisiti**
+ Un account AWS attivo
+ Un database Oracle di origine 
+ Database PostgreSQL di destinazione (su Amazon RDS per PostgreSQL o Aurora PostgreSQL compatibile)
+ [Esperienza](https://www.postgresql.org/docs/current/plpgsql.html) nella codifica PL/PgSQL

**Limitazioni**
+ Si applica solo alle versioni di PostgreSQL precedenti alla 12. 
+ Si applica alla versione 11g o successiva del database Oracle.
+ Le colonne virtuali non sono supportate negli strumenti di migrazione dei dati.
+ Si applica solo alle colonne definite nella stessa tabella.
+ Se una colonna generata virtuale fa riferimento a una funzione deterministica definita dall'utente, non può essere utilizzata come colonna chiave di partizionamento.
+ L'output dell'espressione deve essere un valore scalare. Non può restituire un tipo di dati fornito da Oracle, un tipo definito dall'utente o. `LOB` `LONG RAW`
+ Gli indici definiti in base alle colonne virtuali sono equivalenti agli indici basati su funzioni in PostgreSQL.
+ Le statistiche delle tabelle devono essere raccolte.

## Tools (Strumenti)
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-tools"></a>
+ [pgAdmin](https://www.pgadmin.org/) 4 è uno strumento di gestione open source per PostgreSQL. Questo strumento fornisce un'interfaccia grafica che semplifica la creazione, la manutenzione e l'uso degli oggetti del database.
+ [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) è un ambiente di sviluppo gratuito e integrato per lavorare con SQL nei database Oracle in implementazioni tradizionali e cloud. 

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

### Crea tabelle di database di origine e di destinazione
<a name="create-source-and-target-database-tables"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Creare una tabella del database Oracle di origine. | In Oracle Database, crea una tabella con colonne virtuali generate utilizzando la seguente istruzione.<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 questa tabella di origine, i dati nella `STATUS` colonna vengono migrati tramite AWS DMS al database di destinazione. La `FLAG` colonna, tuttavia, viene popolata utilizzando `generate by` funzionalità, quindi non è visibile ad AWS DMS durante la migrazione. Per implementare la funzionalità di`generated by`, è necessario utilizzare i trigger e le funzioni nel database di destinazione per compilare i valori nella `FLAG` colonna, come illustrato nella prossima epopea. | DBA, sviluppatore di app | 
| Crea una tabella PostgreSQL di destinazione su AWS. | Crea una tabella PostgreSQL su AWS utilizzando la seguente istruzione.<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 questa tabella, la `status` colonna è una colonna standard. La `flag` colonna sarà una colonna generata in base ai dati contenuti nella `status` colonna. | DBA, sviluppatore di app | 

### Crea una funzione di attivazione per gestire la colonna virtuale in PostgreSQL
<a name="create-a-trigger-function-to-handle-the-virtual-column-in-postgresql"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea un trigger PostgreSQL. | In PostgreSQL, crea un 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, sviluppatore di app | 
| Crea una funzione trigger PostgreSQL. | In PostgreSQL, crea una funzione per il trigger. Questa funzione popola una colonna virtuale che viene inserita o aggiornata dall'applicazione o da AWS DMS e convalida i dati.<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, sviluppatore di app | 

### Testa la migrazione dei dati utilizzando AWS DMS
<a name="test-data-migration-by-using-aws-dms"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Creare un'istanza di replica. | Per creare un'istanza di replica, segui le [istruzioni nella documentazione](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Creating.html) di AWS DMS. L'istanza di replica deve trovarsi nello stesso cloud privato virtuale (VPC) dei database di origine e di destinazione. | DBA, sviluppatore di app | 
| Crea endpoint di origine e destinazione. | Per creare gli endpoint, segui [le istruzioni nella documentazione](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.Creating.html) di AWS DMS. | DBA, sviluppatore di app | 
| Verifica le connessioni degli endpoint. | **È possibile testare le connessioni degli endpoint specificando il VPC e l'istanza di replica e scegliendo Esegui test.** | DBA, sviluppatore di app | 
| Crea e avvia un'attività a pieno carico. | Per istruzioni, consulta [Creazione di un'attività](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html) e [Impostazioni di caricamento completo](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.html) nella documentazione di AWS DMS. | DBA, sviluppatore di app | 
| Convalida i dati per la colonna virtuale. | Confronta i dati nella colonna virtuale nei database di origine e di destinazione. È possibile convalidare i dati manualmente o scrivere uno script per questo passaggio. | DBA, sviluppatore di app | 

## Risorse correlate
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-resources"></a>
+ [Guida introduttiva ad AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_GettingStarted.html) (documentazione AWS DMS)
+ [Utilizzo di un database Oracle come origine per AWS DMS (documentazione](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html) AWS DMS)
+ [Utilizzo di un database PostgreSQL come destinazione per AWS DMS (documentazione AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html))
+ [Colonne generate in PostgreSQL (documentazione PostgreSQL](https://www.postgresql.org/docs/12/ddl-generated-columns.html))
+ [Funzioni di attivazione](https://www.postgresql.org/docs/12/plpgsql-trigger.html) (documentazione PostgreSQL)
+ [Colonne virtuali](https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#SQLRF01402) in Oracle Database (documentazione Oracle)