

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Migre colunas geradas virtualmente do Oracle para o PostgreSQL
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql"></a>

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

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

Na versão 11 e nas anteriores, o PostgreSQL não fornece um atributo que seja diretamente equivalente a uma coluna virtual Oracle. Lidar com colunas geradas virtualmente durante a migração do banco de dados Oracle para o PostgreSQL versão 11 ou anterior é difícil por dois motivos: 
+ As colunas virtuais não são visíveis durante a migração.
+ O PostgreSQL não suporta a expressão `generate` em versões anteriores à versão 12.

No entanto, existem soluções alternativas para emular funcionalidades semelhantes. Ao usar o AWS Database Migration Service (AWS DMS) para migrar dados do banco de dados do Oracle para PostgreSQL versão 11 ou anterior, você pode usar funções de gatilho para preencher os valores em colunas geradas virtualmente. Esse padrão fornece exemplos do banco de dados Oracle e do código PostgreSQL que você pode usar para essa finalidade. Na AWS, você pode usar o Amazon Relational Database Service (Amazon RDS) para PostgreSQL ou Amazon Aurora Edição Compatível com PostgreSQL para o seu banco de dados PostgreSQL.

A partir da versão 12 do PostgreSQL, as colunas geradas são suportadas. As colunas geradas podem ser calculadas a partir de outros valores de coluna em tempo real ou calculadas e armazenadas. As [colunas geradas do PostgreSQL](https://www.postgresql.org/docs/12/ddl-generated-columns.html) são semelhantes às colunas virtuais do Oracle.

## Pré-requisitos e limitações
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-prereqs"></a>

**Pré-requisitos **
+ Uma conta AWS ativa
+ Um banco de dados Oracle de origem 
+ Bancos de dados PostgreSQL de destino (no Amazon RDS para PostgreSQL ou Aurora compatível com PostgreSQL)
+ Experiência em codificação [PL/pgSQL](https://www.postgresql.org/docs/current/plpgsql.html)

**Limitações**
+ Aplica-se somente às versões do PostgreSQL anteriores à versão 12. 
+ Aplica-se ao Oracle Database versão 11g ou superior.
+ As colunas virtuais não são suportadas nas ferramentas de migração de dados.
+ Aplica-se somente às colunas definidas na mesma tabela.
+ Se uma coluna virtual gerada se referir a uma função determinística definida pelo usuário, ela não poderá ser usada como uma coluna principal de particionamento.
+ A saída da expressão deve ser um valor escalar. Ele não pode retornar um tipo de dados fornecido pelo Oracle, um tipo definido pelo usuário, `LOB` ou `LONG RAW`.
+ Os índices definidos em colunas virtuais são equivalentes aos índices baseados em funções no PostgreSQL.
+ As estatísticas da tabela devem ser coletadas.

## Ferramentas
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-tools"></a>
+ O [pgAdmin 4](https://www.pgadmin.org/) é uma ferramenta de gerenciamento de código aberto para PostgreSQL. Essa ferramenta fornece uma interface gráfica que simplifica a criação, manutenção e uso de objetos de banco de dados.
+ O [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) é um ambiente de desenvolvimento gratuito e integrado para trabalhar com SQL em bancos de dados Oracle em implantações tradicionais e em nuvem. 

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

### Crie tabelas de banco de dados de origem e destino
<a name="create-source-and-target-database-tables"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie uma tabela de origem do Oracle Database. | No Oracle Database, crie uma tabela com colunas geradas virtuais usando a instrução a seguir.<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>Nessa tabela de origem, os dados na coluna `STATUS` são migrados pelo AWS DMS para o banco de dados de destino. No entanto, a coluna `FLAG` é preenchida usando a funcionalidade `generate by`, portanto, essa coluna não fica visível para o AWS DMS durante a migração. Para implementar a funcionalidade de `generated by`, você deve usar gatilhos e funções no banco de dados de destino para preencher os valores na coluna `FLAG`, conforme mostrado no próximo épico. | DBA, desenvolvedor de aplicativos | 
| Crie uma tabela PostgreSQL de destino na AWS. | Crie uma tabela PostgreSQL na AWS usando a instrução a seguir.<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>Nessa tabela, a coluna `status` é uma coluna padrão. A coluna `flag` será uma coluna gerada com base nos dados da coluna `status`. | DBA, desenvolvedor de aplicativos | 

### Crie uma função de gatilho para lidar com a coluna virtual no PostgreSQL
<a name="create-a-trigger-function-to-handle-the-virtual-column-in-postgresql"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie um gatilho do PostgreSQL. | No PostgreSQL, crie um gatilho.<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, desenvolvedor de aplicativos | 
| Crie uma função de gatilho do PostgreSQL. | No PostgreSQL, crie uma função para o gatilho. Essa função preenche uma coluna virtual que é inserida ou atualizada pelo aplicativo ou pelo AWS DMS e valida os dados.<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, desenvolvedor de aplicativos | 

### Teste a migração de dados usando o AWS DMS
<a name="test-data-migration-by-using-aws-dms"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie uma instância de replicação. | Para criar uma instância de replicação, siga as [instruções](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Creating.html) na documentação do AWS DMS. A instância de replicação deve estar na mesma nuvem privada virtual (VPC) que os bancos de dados de origem e de destino. | DBA, desenvolvedor de aplicativos | 
| Criar endpoints de origem e de destino. | Para criar endpoints, siga as [instruções](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.Creating.html) na documentação do AWS DMS. | DBA, desenvolvedor de aplicativos | 
| Testar as conexões do endpoint. | Você pode testar as conexões do endpoint especificando a VPC e a instância de replicação e escolhendo **Executar teste**. | DBA, desenvolvedor de aplicativos | 
| Crie e inicie uma tarefa de carga completa. | Para obter instruções, consulte [Criação de uma tarefa](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html) e [Configurações de tarefa de carga completa](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.html) na documentação do AWS DMS. | DBA, desenvolvedor de aplicativos | 
| Valide os dados da coluna virtual. | Compare os dados na coluna virtual nos bancos de dados de origem e de destino. Você pode validar os dados manualmente ou escrever um script para essa etapa. | DBA, desenvolvedor de aplicativos | 

## Recursos relacionados
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-resources"></a>
+ [Introdução ao AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_GettingStarted.html) (documentação do AWS DMS)
+ [Uso de um banco de dados Oracle como origem para o AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html) (documentação do AWS DMS)
+ [Uso de um banco de dados PostgreSQL como destino para o AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html) (documentação do AWS DMS)
+ [Colunas geradas no PostgreSQL](https://www.postgresql.org/docs/12/ddl-generated-columns.html) (documentação do PostgreSQL)
+ [Funções de gatilho](https://www.postgresql.org/docs/12/plpgsql-trigger.html) (documentação do PostgreSQL)
+ [Colunas virtuais](https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#SQLRF01402) no banco de dados Oracle (documentação do Oracle)