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 sólo lectura. La base de datos de suscripciones debe tratarse como de sólo lectura a menos que utilice la réplica de mezcla, la réplica transaccional con suscripciones actualizables o la réplica transaccional de 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 réplica ejecuta las secuencias de comandos en el suscriptor, pero no en el publicador.
  • La réplica de ejecución de un procedimiento almacenado para 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 se puede utilizar la validación de recuento de filas, pero este método no revela 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 sobre cómo usar esta utilidad en tablas replicadas, vea How to: Compare Replicated Tables for Differences (Replication Programming).
  2. Si los datos no son convergentes, se puede generar una secuencia de comandos 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 réplica:
  • Se utilizan desencadenadores en el suscriptor. Los desencadenadores en el suscriptor deben administrarse correctamente para que no provoquen la no convergencia u otros problemas:
    • Los desencadenadores sólo producen cambios de los datos en un suscriptor si utiliza la réplica de mezcla, la réplica transaccional con suscripciones actualizables o la réplica transaccional de punto a punto. Para obtener más información, vea Información general sobre la réplica de mezcla y Tipos de publicaciones para la réplica 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.
    • Para la réplica transaccional, existen consideraciones adicionales relacionadas con el valor XACT_ABORT y el uso de 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 réplica transaccional.
  • La réplica ejecuta las secuencias de comandos 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 las secuencias de comandos que se ejecutarán antes y después de aplicar la instantánea. Para obtener más información, vea Ejecutar secuencias de comandos antes y después de aplicar la instantánea. El procedimiento almacenado sp_addscriptexec permite ejecutar una secuencia de comandos durante el proceso de sincronización. Para obtener más información, vea How to: Execute Scripts During Synchronization (Replication Transact-SQL Programming).
    Estas secuencias de comandos se utilizan normalmente en tareas administrativas, por ejemplo para agregar inicios de sesión en el suscriptor. Si se utilizan secuencias de comandos para actualizar datos en un suscriptor que debe tratarse como de sólo lectura, el administrador debe asegurarse de que no se produce la no convergencia.
  • La réplica 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 se ejecuta el procedimiento en el publicador, la réplica ejecuta el procedimiento correspondiente en el suscriptor. Para obtener más información, vea Publicar la ejecución de procedimientos almacenados en la réplica transaccional.
    Si el procedimiento almacenado realiza otra acción en el suscriptor o actúa sobre datos diferentes que en el publicador, puede producirse la no convergencia. Considere un procedimiento que ejecuta un cálculo y, a continuación, inserta datos basados en ese 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 réplica 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 cómo omitir estos errores, vea Omitir errores en la réplica transaccional). En la réplica de mezcla, las infracciones de restricciones se tratan como conflictos; se registran, pero no provocan que el Agente de mezcla detenga la sincronización. En ambos tipos de réplica, las infracciones de restricciones pueden producir la no convergencia si una inserción, actualización o eliminación que ha sido correcta en un nodo no lo es en otro.
    Cuando se publica una tabla, las opciones del esquema predeterminado especifican que las restricciones de clave externa y las restricciones CHECK deben crearse en la base de datos de suscripciones con la opción NOT FOR REPLICATION activada. 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 How to: Specify Schema Options (Replication Transact-SQL Programming).

Vea también

Conceptos

Solucionar problemas de réplica

Ayuda e información

Obtener ayuda sobre SQL Server 2005