Migración de SQL Server a PostgreSQL con AWS Schema Conversion Tool - AWS Schema Conversion Tool

Migración de SQL Server a PostgreSQL con AWS Schema Conversion Tool

Puede usar el paquete de extensión de SQL Server a PostgreSQL en AWS SCT. Este paquete de extensión simula las funciones de la base de datos de SQL Server en el código PostgreSQL convertido. Utilice el paquete de extensión de SQL Server a PostgreSQL para simular las funcionalidades de Agente SQL Server y correo electrónico de base de datos de SQL Server. Para obtener más información acerca de los paquetes de extensión, consulte Uso de paquetes de extensión con AWS Schema Conversion Tool.

Privilegios para PostgreSQL como base de datos de destino

Para utilizar PostgreSQL como destino, AWS SCT requiere el privilegio CREATE ON DATABASE. Asegúrese de conceder este privilegio a cada base de datos PostgreSQL de destino.

Para usar los sinónimos públicos convertidos, cambie la ruta de búsqueda predeterminada de la base de datos a "$user", public_synonyms, public.

Puede usar el siguiente ejemplo de código para crear un usuario de base de datos y conceder los privilegios.

CREATE ROLE user_name LOGIN PASSWORD 'your_password'; GRANT CREATE ON DATABASE db_name TO user_name; ALTER DATABASE db_name SET SEARCH_PATH = "$user", public_synonyms, public;

En el ejemplo anterior, sustituya user_name por el nombre del usuario. A continuación, sustituya db_name por el nombre de su base de datos de destino. Por último, sustituya your_password por una contraseña segura.

En PostgreSQL, solo el propietario de un esquema o un superuser puede anular un esquema. El propietario puede eliminar un esquema y todos los objetos que incluye este esquema, aunque el propietario del esquema no sea propietario de algunos de los objetos.

Si utiliza distintos usuarios para convertir y aplicar diferentes esquemas a la base de datos de destino, es posible que aparezca un mensaje de error cuando AWS SCT no pueda anular un sistema. Para evitar este mensaje de error, utilice el rol de superuser.

Conversión de SQL Server a PostgreSQL

Para editar la configuración de conversión de SAP ASE a PostgreSQL, seleccione Configuración y, a continuación, elija Configuración de conversión. En la lista superior, elija SQL Server y, a continuación, SQL Server — PostgreSQL. AWS SCT muestra todos los ajustes disponibles para la conversión de SQL Server a PostgreSQL.

La configuración de conversión de SQL Server a PostgreSQL en AWS SCT incluye opciones para lo siguiente:

  • Limitar el número de comentarios con elementos de acción en el código convertido.

    En Agregar comentarios en el código convertido para los elementos de acción de la gravedad seleccionada o superior, seleccione la gravedad de los elementos de acción. AWS SCT agrega comentarios en el código convertido para los elementos de acción de la gravedad seleccionada o superior.

    Por ejemplo, para minimizar el número de comentarios en el código convertido, seleccione Solo errores. Para incluir comentarios para todos los elementos de acción del código convertido, seleccione Todos los mensajes.

  • Permitir el uso de índices con el mismo nombre en diferentes tablas de SQL Server.

    En PostgreSQL, todos los nombres de índice que utilice en el esquema deben ser únicos. Para asegurarse de que AWS SCT genera nombres únicos para todos los índices, seleccione Generar nombres únicos para los índices.

  • Convertir los procedimientos de SQL Server en funciones de PostgreSQL.

    La versión 10 y anteriores de PostgreSQL no admiten procedimientos. Para los usuarios que no están familiarizados con el uso de procedimientos en PostgreSQL, AWS SCT puede convertir los procedimientos a funciones. Para ello, seleccione Convertir procedimientos en funciones.

  • Simular la salida de EXEC en una tabla.

    Su base de datos de SQL Server de origen puede almacenar la salida de EXEC en una tabla. AWS SCT crea tablas temporales y un procedimiento adicional para simular esta característica. Para usar esta simulación, seleccione Crear rutinas adicionales para gestionar conjuntos de datos abiertos.

  • Definir la plantilla que se utilizará para los nombres de los esquemas del código convertido. En Plantilla de generación de nombres de esquema, elija una de las siguientes opciones:

    • <source_db>: utiliza el nombre de la base de datos de SQL Server como nombre de esquema en PostgreSQL.

    • <source_schema>: utiliza el nombre del esquema de SQL Server como nombre de esquema en PostgreSQL.

    • <source_db>_<schema>: utiliza una combinación de los nombres de la base de datos y del esquema de SQL Server como nombre de esquema en PostgreSQL.

  • Mantener las mayúsculas y minúsculas de los nombres de los objetos de origen.

    Para evitar la conversión de los nombres de los objetos a minúsculas, seleccione Evitar la conversión a minúsculas para las operaciones que distingan mayúsculas y minúsculas. Esta opción solo se aplica cuando se activa la opción de distinguir entre mayúsculas y minúsculas en la base de datos de destino.

  • Conservar los nombres de los parámetros de la base de datos de origen.

    Para agregar comillas dobles a los nombres de los parámetros del código convertido, seleccione Conservar los nombres de los parámetros originales.

Conversión de particiones de SQL Server en particiones de PostgreSQL versión 10

Al convertir una base de datos de Microsoft SQL Server en Amazon Aurora PostgreSQL Compatible Edition (Aurora PostgreSQL) o Amazon Relational Database Service para PostgreSQL (Amazon RDS para PostgreSQL), tenga en cuenta lo siguiente.

En SQL Server, debe crear particiones con funciones de partición. Cuando una tabla particionada de SQL Server se convierte en una tabla particionada de PostgreSQL versión 10, debe tenerse en cuenta que pueden producirse algunos problemas:

  • SQL Server le permite particionar una tabla utilizando una columna sin la restricción NOT NULL. En ese caso, todos los valores NULL van a la partición situada más a la izquierda. PostgreSQL no admite valores NULL con particiones RANGE.

  • SQL Server le permite crear claves principales y claves únicas para tablas particionadas. En el caso de PostgreSQL, las claves primarias y las claves únicas se crean directamente para cada partición. Por tanto, la restricción PRIMARY o UNIQUE KEY debe eliminarse de la tabla principal al migrar a PostgreSQL. Los nombres de clave resultantes tienen el formato <original_key_name>_<partition_number>.

  • SQL Server permite crear restricciones de clave externa que tienen como origen o destino tablas particionadas. PostgreSQL no admite las claves externas que hacen referencia a tablas particionadas. Además, PostgreSQL tampoco admite las referencias de clave externa entre una tabla particionada y otra tabla.

  • SQL Server permite crear índices para las tablas particionadas. En PostgreSQL, los índices deben crearse directamente con cada partición. Por lo tanto, los índices deben eliminarse de sus tablas principales al migrar a PostgreSQL. Los nombres de índice resultantes tienen el formato <original_index_name>_<partition_number>.

  • PostgreSQL no admite índices particionados.

Consideraciones sobre la migración

Hay algunos aspectos que deben tenerse en cuenta al migrar un esquema de SQL Server a PostgreSQL:

  • En PostgreSQL, todos los nombres de objeto de un esquema deben ser único, incluidos los índices. Los nombres de los índices deben ser únicos en el esquema de la tabla base. En SQL Server, un nombre de índice puede ser igual en diferentes tablas.

    Para garantizar la exclusividad de los índices, AWS SCT brinda la opción de generar nombres de índice únicos si dichos nombres de índice no lo son. Para ello, seleccione la opción Generate unique index names (Generar nombres de índice únicos) en las propiedades del proyecto. Esta opción está habilitada de forma predeterminada. Si esta opción está habilitada, se crean nombres de índice único con el formato IX_nombre_tabla_nombre_índice. Si esta opción está deshabilitada, los nombres de índice no se modifican.

  • Para cambiar el orden en el que se ejecutan las instrucciones, se puede utilizar una instrucción GOTO y una etiqueta. Todas las instrucciones Transact-SQL que van detrás de una instrucción GOTO se omiten y el procesamiento continúa en la etiqueta. Las instrucciones GOTO y las etiquetas se pueden utilizar en cualquier lugar de un procedimiento, lote o bloque de instrucciones. Las instrucciones GOTO también se pueden anidar.

    PostgreSQL no utiliza instrucciones GOTO. Cuando AWS SCT convierte un código que contiene una instrucción GOTO, convierte esta instrucción para utilizar una instrucción BEGIN...END o LOOP...END LOOP. En la tabla siguiente, puede ver algunos ejemplos de cómo AWS SCT convierte las instrucciones GOTO.

    Instrucciones GOTO de SQL Server e instrucciones PostgreSQL convertidas
    Instrucción de SQL Server Instrucción de PostgreSQL
    BEGIN .... statement1; .... GOTO label1; statement2; .... label1: Statement3; .... END
    BEGIN label1: BEGIN .... statement1; .... EXIT label1; statement2; .... END; Statement3; .... END
    BEGIN .... statement1; .... label1: statement2; .... GOTO label1; statement3; .... statement4; .... END
    BEGIN .... statement1; .... label1: LOOP statement2; .... CONTINUE label1; EXIT label1; END LOOP; statement3; .... statement4; .... END
    BEGIN .... statement1; .... label1: statement2; .... statement3; .... statement4; .... END
    BEGIN .... statement1; .... label1: BEGIN statement2; .... statement3; .... statement4; .... END; END
  • PostgreSQL no admite la instrucción MERGE. AWS SCT simula el comportamiento de una instrucción MERGE de las siguientes maneras:

    • Mediante la construcción INSERT ON CONFLICT.

    • Mediante la instrucción UPDATE FROM DML, como MERGE sin la cláusula WHEN NOT MATCHED.

    • Mediante el uso de CURSOR, como con una cláusula MERGE con DELETE o mediante el uso de una instrucción de condición compleja MERGE ON.

  • AWS SCT puede agregar disparadores de bases de datos al árbol de objetos cuando el destino es Amazon RDS.

  • AWS SCT puede agregar disparadores de nivel de servidor al árbol de objetos cuando el destino es Amazon RDS.

  • SQL Server crea y administra tablas deleted y inserted de forma automática. Puede utilizar estas tablas temporales que residen en la memoria para probar los efectos de determinadas modificaciones en los datos y establecer las condiciones para las acciones que desencadenan el DML. AWS SCT puede convertir el uso de estas tablas en instrucciones de activación de DML.

  • AWS SCT puede agregar servidores enlazados al árbol de objetos cuando el destino es Amazon RDS.

  • Al migrar desde Microsoft SQL Server a PostgreSQL, la función SUSER_SNAME integrada se convierte tal y como se indica a continuación:

    • SUSER_SNAME: devuelve el nombre de inicio de sesión asociado a un número de identificación de seguridad (SID).

    • SUSER_SNAME(<sid_usuario_servidor>): no admitido.

    • SUSER_SNAME() CURRENT_USER: devuelve el nombre de usuario del contexto de ejecución actual.

    • SUSER_SNAME (NULL): devuelve NULL.

  • Se permite la conversión de funciones con valores de tabla. Las funciones con valores de tabla devuelven una tabla y pueden tomar el lugar de una tabla en una consulta.

  • PATINDEX devuelve la posición inicial de la primera coincidencia de un patrón en una expresión especificada en todos los tipos de datos de texto y caracteres válidos. Devuelve ceros si no se encuentra el patrón. Al convertir de SQL Server a Amazon RDS para PostgreSQL, AWS SCT reemplaza el código de aplicación que usa PATINDEX por aws_sqlserver_ext.patindex(<pattern character>, <expression character varying>) .

  • En SQL Server, un tipo de tabla definido por el usuario es un tipo que representa la definición de la estructura de una tabla. Se utiliza un tipo de tabla definido por el usuario para declarar parámetros de valor de tabla para procedimientos o funciones almacenados. También puede utilizar un tipo de tabla definido por el usuario para declarar las variables de tabla que desea utilizar en un lote o en el cuerpo de un procedimiento o función almacenados. AWS SCT simula este tipo en PostgreSQL creando una tabla temporal.

Al convertir de SQL Server a PostgreSQL, AWS SCT convierte los objetos de sistema de SQL Server en objetos reconocibles en PostgreSQL. En la siguiente tabla se muestra cómo se convierten los objetos del sistema.

Casos de uso de MS SQL Server Sustitución de PostgreSQL

SYS.SCHEMAS

AWS_SQLSERVER_EXT.SYS_SCHEMAS

SYS.TABLES

AWS_SQLSERVER_EXT.SYS_TABLES

SYS.VIEWS

AWS_SQLSERVER_EXT.SYS_VIEWS

SYS.ALL_VIEWS

AWS_SQLSERVER_EXT.SYS_ALL_VIEWS

SYS.TYPES

AWS_SQLSERVER_EXT.SYS_TYPES

SYS.COLUMNS

AWS_SQLSERVER_EXT.SYS_COLUMNS

SYS.ALL_COLUMNS

AWS_SQLSERVER_EXT.SYS_ALL_COLUMNS

SYS.FOREIGN_KEYS

AWS_SQLSERVER_EXT.SYS_FOREIGN_KEYS

SYS.SYSFOREIGNKEYS

AWS_SQLSERVER_EXT.SYS_SYSFOREIGNKEYS

SYS.FOREIGN_KEY_COLUMNS

AWS_SQLSERVER_EXT.SYS_FOREIGN_KEY_COLUMNS

SYS.KEY_CONSTRAINTS

AWS_SQLSERVER_EXT.SYS_KEY_CONSTRAINTS

SYS.IDENTITY_COLUMNS

AWS_SQLSERVER_EXT.SYS_IDENTITY_COLUMNS

SYS.PROCEDURES

AWS_SQLSERVER_EXT.SYS_PROCEDURES

SYS.INDEXES

AWS_SQLSERVER_EXT.SYS_INDEXES

SYS.SYSINDEXES

AWS_SQLSERVER_EXT.SYS_SYSINDEXES

SYS.OBJECTS

AWS_SQLSERVER_EXT.SYS_OBJECTS

SYS.ALL_OBJECTS

AWS_SQLSERVER_EXT.SYS_ALL_OBJECTS

SYS.SYSOBJECTS

AWS_SQLSERVER_EXT.SYS_SYSOBJECTS

SYS.SQL_MODULES

AWS_SQLSERVER_EXT.SYS_SQL_MODULES

SYS.DATABASES

AWS_SQLSERVER_EXT.SYS_DATABASES

INFORMATION_SCHEMA.SCHEMATA

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_SCHEMATA

INFORMATION_SCHEMA.VIEWS

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_VIEWS

INFORMATION_SCHEMA.TABLES

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_TABLES

INFORMATION_SCHEMA.COLUMNS

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_COLUMNS

INFORMATION_SCHEMA.CHECK_CONSTRAINTS

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_CHECK_CONSTRAINTS

INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_REFERENTIAL_CONSTRAINTS

INFORMATION_SCHEMA.TABLE_CONSTRAINTS

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_TABLE_CONSTRAINTS

INFORMATION_SCHEMA.KEY_COLUMN_USAGE

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_KEY_COLUMN_USAGE

INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_CONSTRAINT_TABLE_USAGE

INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_CONSTRAINT_COLUMN_USAGE

INFORMATION_SCHEMA.ROUTINES

AWS_SQLSERVER_EXT.INFORMATION_SCHEMA_ROUTINES

SYS.SYSPROCESSES

AWS_SQLSERVER_EXT.SYS_SYSPROCESSES

sys.system_objects

AWS_SQLSERVER_EXT.SYS_SYSTEM_OBJECTS