

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Migración de columnas generadas de forma virtual de Oracle a PostgreSQL
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql"></a>

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

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

En la versión 11 y anteriores, PostgreSQL no proporciona una característica que sea directamente equivalente a una columna virtual de Oracle. Gestionar las columnas generadas de forma virtual al migrar de Oracle Database a la versión 11 o anterior de PostgreSQL resulta difícil por dos motivos: 
+ Las columnas virtuales no están visibles durante la migración.
+ PostgreSQL no admite la expresión `generate` antes de la versión 12.

Sin embargo, existen soluciones alternativas para emular una funcionalidad similar. Cuando utilice AWS Database Migration Service (AWS DMS) para migrar datos desde Oracle Database a la versión 11 y anteriores de PostgreSQL, puede utilizar las funciones de activación para rellenar los valores de las columnas generadas de forma virtual. Este patrón proporciona ejemplos de código PostgreSQL y Oracle Database que puede utilizar para este fin. En AWS, puede utilizar Amazon Relational Database Service (Amazon RDS) para PostgreSQL o la Edición compatible con PostgreSQL de Amazon Aurora para la base de datos de PostgreSQL.

A partir de la versión 12 de PostgreSQL, se admiten las columnas generadas. Las columnas generadas pueden calcularse sobre la marcha a partir de otros valores de columna o calcularse y almacenarse. [Las columnas generadas por PostgreSQL](https://www.postgresql.org/docs/12/ddl-generated-columns.html) son similares a las columnas virtuales de Oracle.

## Requisitos previos y limitaciones
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-prereqs"></a>

**Requisitos previos **
+ Una cuenta de AWS activa
+ Base de datos de origen de Oracle 
+ Bases de datos PostgreSQL de destino (en Amazon RDS para PostgreSQL o Aurora compatible con PostgreSQL)
+ Experiencia en codificación [PL/pgSQL](https://www.postgresql.org/docs/current/plpgsql.html)

**Limitaciones**
+ Solo se aplica a las versiones de PostgreSQL anteriores a la versión 12. 
+ Se aplica a la versión 11g o posterior de Oracle Database.
+ Las columnas virtuales no se admiten en las herramientas de migración de datos.
+ Solo se aplica a las columnas definidas en la misma tabla.
+ Si una columna generada de forma virtual hace referencia a una función determinista definida por el usuario, no se puede utilizar como columna clave de partición.
+ El resultado de la expresión debe ser un valor escalar. No puede devolver un tipo de datos proporcionado por Oracle, un tipo definido por el usuario, `LOB` o `LONG RAW`.
+ Los índices que se definen en columnas virtuales equivalen a los índices basados en funciones en PostgreSQL.
+ Se deben recopilar las estadísticas de las tablas.

## Tools (Herramientas)
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-tools"></a>
+ [pgAdmin 4](https://www.pgadmin.org/) es una herramienta de gestión de código abierto para PostgreSQL. Esta herramienta proporciona una interfaz gráfica que simplifica la creación, el mantenimiento y el uso de los objetos de la base de datos.
+ [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) es un entorno de desarrollo integrado y gratuito para trabajar con SQL en bases de datos de Oracle, tanto en implementaciones tradicionales como en la nube. 

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

### Cree tablas de bases de datos de origen y destino
<a name="create-source-and-target-database-tables"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una tabla de base de datos de Oracle de origen. | En Oracle Database, cree una tabla con columnas generadas de forma virtual mediante la siguiente declaración.<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 />En esta tabla de origen, los datos de la columna `STATUS` se migran a través de AWS DMS a la base de datos de destino. Sin embargo, la columna `FLAG` se rellena mediante la funcionalidad `generate by`, por lo que AWS DMS no podrá verla durante la migración. Para implementar la funcionalidad de `generated by`, debe utilizar activadores y funciones de la base de datos de destino para rellenar los valores de la columna `FLAG`, como se muestra en la siguiente epopeya. | Administrador de base de datos, desarrollador de aplicaciones | 
| Cree una tabla PostgreSQL de destino en AWS. | Cree una tabla de PostgreSQL en AWS con la siguiente instrucción.<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 />En esta tabla, la columna `status` es una columna estándar. La columna `flag` será una columna generada en función de los datos de la columna `status`. | Administrador de base de datos, desarrollador de aplicaciones | 

### Cree una función de activación para gestionar la columna virtual en PostgreSQL
<a name="create-a-trigger-function-to-handle-the-virtual-column-in-postgresql"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un activador de PostgreSQL. | En PostgreSQL, cree un activador.<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> | Administrador de base de datos, desarrollador de aplicaciones | 
| Cree una función de activación de PostgreSQL. | En PostgreSQL, cree una función para el activador. Esta función rellena una columna virtual que la aplicación o AWS DMS insertan o actualizan y valida los datos.<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> | Administrador de base de datos, desarrollador de aplicaciones | 

### Pruebe la migración de datos mediante AWS DMS
<a name="test-data-migration-by-using-aws-dms"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una instancia de replicación. | Para crear una instancia de replicación, siga las [instrucciones](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Creating.html) de la documentación de AWS DMS. La instancia de replicación debe estar en la misma nube privada virtual (VPC) que las bases de datos de origen y destino. | Administrador de base de datos, desarrollador de aplicaciones | 
| Cree puntos de conexión de origen y destino. | Para crear los puntos de conexión, siga las [instrucciones de la documentación de AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.Creating.html). | Administrador de base de datos, desarrollador de aplicaciones | 
| Probar los puntos de conexión. | Puede probar las conexiones de conexión especificando la VPC y la instancia de replicación y seleccionando **Ejecutar prueba**. | Administrador de base de datos, desarrollador de aplicaciones | 
| Cree e inicie una tarea de carga completa. | Para obtener instrucciones, consulte [Creación de una tarea](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html) y [Configuración de tareas de carga completa](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.html) en la documentación de AWS DMS. | Administrador de base de datos, desarrollador de aplicaciones | 
| Valide los datos de la columna virtual. | Compare los datos de la columna virtual en las bases de datos de origen y destino. Puede validar los datos manualmente o escribir un script para este paso. | Administrador de base de datos, desarrollador de aplicaciones | 

## Recursos relacionados
<a name="migrate-virtual-generated-columns-from-oracle-to-postgresql-resources"></a>
+ [Introducción a AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_GettingStarted.html) (documentación de AWS DMS)
+ [Uso de una base de datos de Oracle como fuente para AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html) (documentación de AWS DMS)
+ [Uso de una base de datos PostgreSQL como destino para AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html) (documentación de AWS DMS)
+ [Columnas generadas en PostgreSQL](https://www.postgresql.org/docs/12/ddl-generated-columns.html) (documentación de PostgreSQL)
+ [Funciones de activación](https://www.postgresql.org/docs/12/plpgsql-trigger.html) (documentación de PostgreSQL)
+ [Columnas virtuales](https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#SQLRF01402) en Oracle Database (documentación de Oracle)