Compartir a través de


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 replicación de mezcla, la replicación transaccional con suscripciones actualizables o la replicación transaccional del mismo nivel.

  • 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 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 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. 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 replicación de mezcla, la replicación transaccional con suscripciones actualizables o la replicación transaccional del mismo nivel. 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.

    • Para la replicación 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 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 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 utilizan normalmente 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 sólo 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 se ejecuta el procedimiento 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 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 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 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; se registran, pero no provocan que el Agente de mezcla detenga la sincronización. En ambos tipos de replicación, 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 Cómo especificar opciones de esquema (programación de la replicación con Transact-SQL).

Vea también

Conceptos