Compare y sincronice automáticamente datos de SQL Server

Hay numerosos escenarios cuando la sincronización de datos entre dos bases de datos es necesaria, como cuando se distribuye datos a diferentes localizaciones, en la integración de datos desde diferentes localizaciones en un repositorio central, o una simple sincronización entre sus bases de datos de prueba y de producción.

La solución recomendada es usar la replicación de bases de datos.

De todas maneras, incluso con la replicación de bases de datos es necesario verificar si todos los datos son sincronizados y sincronizarlos si es necesario.

Otra situación donde la sincronización de datos es necesaria puede ser cuando los datos son accidentalmente borrados de una base de datos de prueba, y usted quiere recuperarlos insertando datos de la base de datos de producción.

Aquí están muchos métodos que usted puede usar para comparar y sincronizar sus bases de datos:

  1. Use SQL con la sentencia UNION ALL para encontrar los registros que no corresponden en 2 tablas idénticas.
    SELECT
           MIN(TableName) AS TableName,
           ID,
           Name,
           lastname,
           Address,
           City
      FROM(
        SELECT
               'Table A' AS TableName,
               Customers.id,
               Customers.Name,
               Customers.lastname,
               Customers.Address,
               Customers.City
          FROM Customers
        UNION ALL
        SELECT
               'Table B' AS TableName,
               CustomersOld.id,
               CustomersOld.Name,
               CustomersOld.lastname,
               CustomersOld.Address,
               CustomersOld.City
          FROM CustomersOld)tmp
    GROUP BY
             ID,
             Name,
             lastname,
             Address,
             City
    HAVING COUNT(*) = 1
    ORDER BY
             id;

     

    Para la table Customers

    Y CustomersOld

    El script retorna los siguientes resultados:

    Cuando Name para ID=1 en la tabla CustomersOId es cambiado a ‘John’, de manera que los registros queden iguales, SQL retorna lo siguiente:

    Cuando se comparan los datos en una tabla, este método provee suficiente información para comenzar. De todas maneras, no provee ninguna ayuda con la sincronización de datos – ésta tiene que ser manual, registro por registro. Otra desventaja de este método es que usted necesita modificar SQL para cada tabla, de acuerdo con su estructura. Tampoco puede ser usado en datos de tipo text, ntext e imágenes. Para resumir – si usted desea comparar muchas tablas y sincronizarlas – este método requiere mucho tiempo y, debido a la sincronización manual que requiere, es muy proclive a errores.

  2. Use Data Compare en Visual Studio
    Compara datos en la base de datos fuente y la base de datos objetivo y crea un script de sincronización para las tablas que usted selección para sincronización.

    En adición al hecho de que usted en verdad necesita tener Visual Studio edición Ultimate o Premium, un conocimiento de programación es necesario igualmente. También, esta característica no puede comparar y sincronizar datos en los siguientes escenarios:

    • Los nombres de las columnas en la fuente y el destino no son idénticos.
    • Nombres de vistas y tablas sensibles a mayúsculas y minúsculas.
    • Las tablas no tienen llaves primarias idénticas, índice único, o restricción única.
    • Las vistas no tienen un índice único y agrupado

     

  3. Use TableDiff de SQL Server

    TableDiff.exe ya está en la carpeta COM en su instalación de SQL Server. Compara diferencias en las tablas y vistas fuente y de destino, genera un scripts que puede ser ejecutado para sincronizar los datos.

    Use el siguiente comando para comprar las tablas Person.Address en las bases de datos fuente y destino y para generar un script de sincronización llamado differencesPersonAddress.sql

    tablediff.exe -sourceserver Fuji\SQL2012 -sourcedatabase AdventureWorks2012 
    -sourceschema Person -sourcetable Address  -destinationserver Fuji\SQL2012 
    -destinationdatabase CasaBianca -destinationschema Person 
    -destinationtable Address -f e:\table1_differences.sql

     

    En el caso de que la estructura de las tablas sea diferente, por ejemplo una tiene la columna PostalCode, y la otra PostalCd, la comparación y sincronización no será posible y usted verá el siguiente mensaje:

    Las desventajas de TableDiff.exe son que no hay GUI – usted puede usarlo solamente desde la línea de Comandos o en un archivo batch, no hay muchas opciones de comparación y sincronización, las tablas necesitan tener al menos una llave primaria, indentidad, o una columna ROWGUID. Uno de los retos que encontrará al usar TableDiff.exe es que usted no puede comparar automáticamente todas las tablas en una base de datos. Para hacerlo, usted tendría que escribir código adicional, leer tablas de sistema para obtener la lista de tablas en una base de datos e iterar a través de la lista.

ApexSQL Data Diff es una herramienta de comparación y sincronización de SQL Server que detecta diferencias de datos y las resuelve sin errores. Puede comprar y sincronizar bases de datos en vivo y copias de seguridad de bases de datos nativas o nativamente comprimidas y generar reportes detallados sobre las diferencias detectadas. En el caso de que los nombres de la tabla o columna que desea comparar tuvieran fueran diferentes, usted puede mapearlos fácilmente. Para tablas sin llaves primarias e índices únicos, usted puede establecer cualquier columna para ser la llave usada para la comparación.

 

  1. Inicie ApexSQL Data Diff
  2. Haga clic en el botón New en el diálogo Project management

  • En el panel Source:
    • Seleccione Database en la lista desplegable Type
    • En la lista desplegable Server, especifique la instancia SQL con la base de datos que contienen los datos correctos
    • Especifique el método de autenticación para esa instancia SQL (y un conjunto válido de credenciales si es que escoge SQL Server authentication)
    • Especifique la base de datos fuente en la lista desplegable Database
  • En el panel Destination:
    • Seleccione Database en la lista desplegable Type
    • En la lista desplegable Server, especifique la instancia SQL con la base de datos destino
    • Especifique el método de autenticación para la instancia SQL (y un conjunto de credenciales válidas si escoge SQL Server authentication)
    • Especifique el nombre de la base de datos destino en la lista desplegable Database
  • Haga clic en el botón Save para guardar el proyecto
  • Especifique el nombre del proyecto y haga clic en Save
  • Haga clic en el botón Compare

  • Verifique si todo está bien, dado que este proyecto será usado en el futuro
  • Para programar la comparación y sincronización de la base de datos SQL, cree un archivo batch que ejecutará el proyecto ApexSQL Data Diff. Guarde el siguiente comando:
    “C:\Program Files (x86)\ApexSQL\ApexSQLDataDiff2014\ApexSQLDataDiff.com” 
    /pf:D:\Test\DataSyncAdventureWorks2014_CasaBianca.axdd 
    /of:D:\Test\DataSync.sql /sync /bu:D:\Test /v /f 

     

    Como el archivo batch E:\Test\DataDiffBatchAW2014CB.bat

    Este creará el SQL DataSync.sql para sincronizar los datos en la base de datos CasaBianca con los datos en AdventureWorks2014 en la carpeta D:\Test, creará una copia de seguridad completa de la base de datos llamada ApexSQLDataDiffBackup_ _YYYY_M_DD_HH_MM_SS_FFF.bak en la carpeta D:\Test. Por ejemplo, ApexSQLDataDiffBackup_CasaBianca_2014_8_15_21_59_19_295.bak

    Usted puede probar este comando CLI primero. Después de una sincronización exitosa, el siguiente mensaje aparecerá:

  • Inicie SQL Server Management Studio
  • En el Object Explorer expanda el SQL Server Agent, haga clic derecho en Jobs y seleccione New job

     

  • En la pestaña General, especifique el nombre de la tarea

  • Haga clic en el botón OK
  • Abra la pestaña Schedules y especifique cuándo debería ocurrir la tarea de sincronización de la base de datos.

  • Para probar la tarea, haga clic derecho en ella y seleccione Start job at Step


    Cuando la tarea sea exitosamente ejecutada, usted recibirá el siguiente mensaje:

No hay necesidad de comparar manualmente los datos sincronizados ya. Use la herramienta de comparación de datos SQL ApexSQL Data Diff para establecer todas las opciones de sincronización, mapear las tablas y columnas con diferentes nombres, crear sus propias llaves para comparación en el GUI. Prográmela para correr sin su intervención y todo lo que tiene que hacer es verificar la historia de tareas en SQL Server en la mañana.

Traductor: Daniel Calbimonte

Junio 4, 2015