Los datos en el publicador y el suscriptor no coinciden

Se considera que los datos en el publicador y el suscriptor no convergen (es decir, que no coinciden) si:

  • Existe un número diferente de filas en el suscriptor y en el publicador, y la publicación no tiene ningún filtro. Si la publicación tiene un filtro, se puede esperar que el número de filas sea diferente.

  • El contenido de los datos de una o varias filas es diferente en el publicador y el suscriptor.

Explicación

Los datos en el publicador y el suscriptor pueden no converger por varios motivos:

  • Los datos se actualizan en un suscriptor que debe tratarse como de solo lectura. La base de datos de suscripciones debe tratarse como de solo lectura a menos que utilice la replicación de mezcla, la replicación transaccional con suscripciones actualizables o la replicación transaccional punto a punto.

  • Se utilizan desencadenadores en el suscriptor. Los desencadenadores pueden modificar datos en el suscriptor y también impedir que los datos se actualicen si el desencadenador emite una instrucción ROLLBACK.

  • La replicación ejecuta los scripts en el suscriptor, pero no en el publicador.

  • La replicación de la ejecución del procedimiento almacenado de una publicación transaccional produce resultados diferentes en el suscriptor.

  • Infracciones de restricciones u otros problemas que impiden que se inserten, actualicen o eliminen filas en el suscriptor.

Acción del usuario

Las siguientes acciones describen cómo determinar si los datos no son convergentes y cómo hacer que lo sean:

  1. Determine si los datos no son convergentes, mediante validación o la utilidad tablediff:

    • Si se puede ejecutar el Agente de distribución o el Agente de mezcla, ejecute la validación de suma de comprobación binaria para determinar si faltan datos. También puede utilizar la validación de número de filas, aunque este método no revela las diferencias en el contenido de los datos. Para obtener más información, vea Validar los datos replicados.

    • Si no se puede ejecutar el Agente de distribución o el Agente de mezcla, determine si los datos no son convergentes ejecutando la utilidad tablediff. Para obtener información acerca de cómo usar esta utilidad en tablas replicadas, vea Cómo comparar tablas replicadas para buscar diferencias (programación de la replicación).

  2. Si los datos no son convergentes, se puede generar un script de Transact-SQL con la utilidad tablediff para hacer que los datos sean convergentes. Para obtener más información, vea tablediff (utilidad).

Tratar la causa de la no convergencia

Las siguientes acciones tratan las causas enumeradas en la sección "Explicación":

  • Los datos se actualizan en el suscriptor fuera de la replicación:

  • Se utilizan desencadenadores en el suscriptor. Es necesario administrar correctamente los desencadenadores en el suscriptor con el fin de que no causen problemas de divergencia o de otro tipo:

    • Los desencadenadores solo deben causar cambios en los datos en el suscriptor si utiliza la replicación de mezcla, la replicación transaccional con opciones de suscripción actualizable o la replicación transaccional punto a punto. Para obtener más información, vea Información general sobre la replicación de mezcla y Tipos de publicaciones para la replicación transaccional.

    • En muchos casos, los desencadenadores deben utilizar la opción NOT FOR REPLICATION. Considere un desencadenador que inserta datos en una tabla de seguimiento: cuando el usuario inserta la fila originalmente, es correcto que se active el desencadenador y se inserte una fila en la tabla de seguimiento, pero el desencadenador no debe activarse cuando los datos se replican en el suscriptor, porque se insertaría una fila de forma innecesaria en la tabla de seguimiento.

      Si un desencadenador incluye una instrucción ROLLBACK y el desencadenador no utiliza la opción NOT FOR REPLICATION, las filas replicadas en un suscriptor pueden no aplicarse.

    • En la replicación transaccional, existen consideraciones adicionales en lo que se refiere a la configuración de XACT_ABORT y al uso de las instrucciones COMMIT y ROLLBACK en un desencadenador. Para obtener más información, vea la sección sobre los desencadenadores en el tema Consideraciones acerca de la replicación transaccional.

  • La replicación ejecuta los scripts en el suscriptor, pero no en el publicador.

    Los parámetros @pre_snapshot_script y @post_snapshot_script de sp_addpublication y sp_addmergepublication permiten especificar los scripts que se ejecutarán antes y después de aplicar la instantánea. Para obtener más información, vea Ejecutar scripts antes y después de aplicar la instantánea. El procedimiento almacenado sp_addscriptexec le permite ejecutar un script durante el proceso de sincronización. Para obtener más información, vea Cómo ejecutar scripts durante la sincronización (programación de la replicación con Transact-SQL).

    Estos scripts se suelen utilizar en tareas administrativas, por ejemplo para agregar inicios de sesión en el suscriptor. Si se utilizan scripts para actualizar datos en un suscriptor que debe tratarse como de solo lectura, el administrador debe asegurarse de que no se produce la no convergencia.

  • La replicación de ejecución de un procedimiento almacenado para una publicación transaccional produce resultados diferentes en el suscriptor.

    Si replica la ejecución de un procedimiento almacenado, la definición del procedimiento se replica en el suscriptor cuando se inicializa la suscripción; cuando el procedimiento se ejecuta en el publicador, la replicación ejecuta el procedimiento correspondiente en el suscriptor. Para obtener más información, vea Publicar la ejecución de procedimientos almacenados en la replicación transaccional.

    Si el procedimiento almacenado realiza una acción diferente en el suscriptor o actúa en otros datos diferentes a los del publicador, se puede producir un error de convergencia. Considere la posibilidad de utilizar un procedimiento que realice un cálculo y, después, inserte datos basados en dicho cálculo. Si se aplica un filtro en el suscriptor de modo que el cálculo en el suscriptor se base en datos diferentes, puede que se inserte un resultado diferente en el suscriptor o que no se inserte ningún resultado.

  • Infracciones de restricciones u otros problemas que impiden que se inserten, actualicen o eliminen filas en el suscriptor.

    En la replicación transaccional, las infracciones de restricciones se tratan como errores; de forma predeterminada, provocan que el Agente de distribución detenga la sincronización si se encuentran (para obtener información acerca de cómo omitir estos errores, vea Omitir errores en la replicación transaccional). En la replicación de mezcla, las infracciones de restricciones se tratan como conflictos, pero no detienen la sincronización que realiza el Agente de mezcla. En ambos tipos de replicación, las infracciones de restricciones pueden conducir a la no convergencia de una inserción, actualización o eliminación que se haya realizado correctamente en un nodo y no se produzca en otro.

    Cuando se publica una tabla, las opciones de esquema predeterminadas especifican que las restricciones de clave externa y las restricciones CHECK se deben crear en la base de datos de suscripciones con la opción NOT FOR REPLICATION establecida. Si la aplicación requiere otra configuración de restricciones, cambie las opciones del esquema. Para obtener más información, vea Cómo especificar opciones de esquema (SQL Server Management Studio) y Cómo especificar opciones de esquema (programación de la replicación con Transact-SQL).

Vea también

Conceptos