Cómo sincronizar dos tablas usando SQL Server Integration Services (SSIS)-Parte II de II

Por favor, utiliza este link para acceder a la primera parte de este artículo.

En esta segunda parte empezaremos con el mismo escenario donde una “tabla A” en una “base de datos A” tiene que ser sincronizada con una “tabla B” en una “base de datos B”. Durante la primera parte de este artículo discutimos cómo trabajar con los nuevos registros añadidos a la “tabla A” pero no explicamos cómo sincronizar los registros ya existentes que también eran actualizados en la “tabla A”.

Dentro de SSIS podemos emplear diferentes métodos para recononcer aquellos registros que difieren entre la tabla origen y la tabla destino. Por ejemplo, podemos usar el operador EXCEPT para extraer esas diferencias y actualizar la tabla destino a continuación. En este caso vamos a usar la utilidad tablediff, que permite sincronizar ambas tablas rápidamente. Esta utilidad se emplea en la Replicación de SQL Server para recopilar información detallada acerca de las diferencias entre dos tablas.

Lo mejor de tablediff es que no sólo permite comparar tablas sino que además permite generar un script que incorpora las diferencias de manera que las tablas pueden ser sincronizadas simplemente ejecutando el script. La limitacion de tablediff es que sólo funciona con servidores SQL Server así que si el objetivo es sincronizar dos tablas con algún otro motor de base de datos no se podrá emplear este método.

En mi caso esto es lo que hice para sincronizar las dos tablas:

1. Nos aseguramos de que la utilidad tablediff está intalada en el servidor de SQL Server. El ejecutable tablediff.exe se puede encontrar bajo el directorio C:\Program Files\Microsoft SQL Server\<version>\COM

2. Añadimos tablediff.exe a la variable Path de Windows desde Computer Properties > Advanced System Settings > Advanced > Environment Variables > System Variables > PATH

3. Nos aseguramos de que xp_cmdshell está habilitada ejecutando sp_configure desde SQL Server Management Studio (SSMS):

Imagen1

Por favor, lee detenidamente la documentación de xp_cmdshell y entiende las implicaciones de usar esta opción en el entorno. xp_cmdshell crea un proceso Windows con los mismos privilegios que los de la cuenta de servicio de SQL Server, lo que significa que los miembros del grupo sysadmins pueden acceder a funciones a las que no tendrían acceso sólo con su cuenta de Windows. Por defecto sólo los miembros del rol de servidor sysadmin en SQL Server están autorizados a ejecutar este procedimiento almacenado extendido. Si tu compañía no dispone de una política para asignar permisos a las cuentas de servicio de SQL Server donde se especifique claramente quién pertenece al este rol, evalua detenidamente la conveniencia de habilitar xp_cmdshell.

4. Utilizando elmismo proyecto de SSIS que creamos durante la primera parte de este artículo, creamos dos tareas del tipo “Execute SQL Task”, bajo la sección de Control Flow en BIDS. La primera tarea, llamada “Execute tablediff” en el ejemplo, se encargará de ejecutar el comando tablediff.exe. Este es un ejemplo del código en mi caso:

exec master..xp_cmdshell 'tablediff.exe -sourceserver SQL2008R2\KILIMANJARO64 -sourcedatabase SSISDBSource -sourcetable Customer -destinationserver SQL2008R2\KILIMANJARO64 -destinationdatabase SSISDBDest -destinationtable Customer -f C:\Temp\Diff'

imagen2

La parte importante en este paso es el modificador –f, que es quien se encarga de crear el script de T-SQL con los cambios que tienen que ser implmentados en la tabla de destino. Este es un ejemplo de este script generado automaticamente:

imagen3

La segunda tarea, llamada “Execute SQL Script” en el ejemplo, se encargará de ejecutar contra la base de datos el script generado en C:\Temp\Diff.sql, llevando a cabo las modificaciones requeridas desde la tabla origen en la tabla destino:

imagen4

5. Opcionalmente podemos combinar la tarea de “Data Flow” que creamos durante la primera parte de este artículo con estas dos tareas y disponer de un paquete de sincronización completo:

imagen5

Jorge Pérez Campo - Microsoft Customer Support Services