Suscripciones actualizables - Para replicación transaccional

Se aplica a:SQL Server

Nota:

Esta característica sigue siendo compatible con las versiones de SQL Server entre 2012 y 2016. Esta característica se quitará en una versión futura de SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.

La replicación transaccional admite actualizaciones en los suscriptores mediante suscripciones actualizables y replicación punto a punto. A continuación se indican los dos tipos de suscripciones actualizables:

  • Actualización inmediata. Para actualizar datos en el suscriptor, el publicador y el suscriptor deben estar conectados.

  • Actualización en cola El publicador y el suscriptor no tienen que estar conectados para actualizar los datos en el suscriptor. Puedes actualizar datos mientras el Suscriptor o Publisher está fuera de línea.

Cuando actualizas datos en un Suscriptor, la actualización primero va al Publisher y luego a otros Suscriptores. Si usas actualización inmediata, los cambios se hacen inmediatamente usando el protocolo de compromiso en dos fases. Si usas la actualización en cola, los cambios se colocan en una cola. Las transacciones en cola van al Publisher de forma asíncrona cuando hay conectividad de red disponible. Como las actualizaciones se envían al Publisher de forma asíncrona, los mismos datos pueden ser actualizados por el Publisher o por otro Suscriptor, y pueden surgir conflictos al aplicar las actualizaciones. El sistema detecta y resuelve conflictos según una política de resolución de conflictos que establezcas al crear la publicación.

Si crea una publicación transaccional con suscripciones actualizables en el Asistente para nueva publicación, se habilitan la actualización inmediata y la actualización en cola. Si crea una publicación con procedimientos almacenados, puede habilitar una o ambas opciones. Al crear una suscripción a la publicación, se especifica el modo de actualización que se va a utilizar. Después, puede cambiar entre modos de actualización si es necesario. Para obtener más información, vea la sección siguiente "Cambio entre modos de actualización".

Para habilitar suscripciones actualizables para publicaciones transaccionales, consulte Habilitar la actualización de suscripciones para publicaciones transaccionales.

Para crear suscripciones actualizables para publicaciones transaccionales, consulte Crear una suscripción actualizable para una publicación transaccional (Management Studio).

Cambio entre modos de actualización

Cuando usas suscripciones actualizables, puedes especificar un modo de actualización para una suscripción y cambiar al otro modo si la aplicación lo requiere. Por ejemplo, puedes especificar que una suscripción use actualización inmediata, pero cambie a actualización en cola si un fallo del sistema provoca la pérdida de conectividad de red.

Nota:

La replicación no cambia automáticamente entre modos de actualización. Establezca el modo de actualización mediante SQL Server Management Studio o llame a sp_setreplfailovermode (Transact-SQL) desde su aplicación para alternar entre modos.

Si cambias de actualización inmediata a actualización en cola, no puedes volver a la actualización inmediata hasta que el Suscriptor y el Publicador estén conectados y el Agente lector de cola aplique al Publicador todos los mensajes pendientes de la cola.

Para cambiar entre modos de actualización

Para cambiar entre modos de actualización, activa la publicación y la suscripción para ambos modos de actualización, y luego alterna entre ellos si es necesario. Para obtener más información, vea
Cambiar entre modos de actualización para una suscripción transaccional actualizable.

Consideraciones para el uso de suscripciones actualizables

  • Después de habilitar una publicación para actualizar suscripciones o suscripciones de actualización en cola, no puedes desactivar la opción para la publicación (aunque las suscripciones no necesitan usarla). Para desactivar la opción, elimina la publicación y crea una nueva.

  • No se permite republicar datos.

  • La replicación agrega la columna msrepl_tran_version a las tablas publicadas con fines de seguimiento. Debido a esta columna extra, incluye una lista de columnas en todas las INSERT sentencias.

  • Para realizar cambios en el esquema de una tabla en una publicación que admite suscripciones actualizables, debe detener toda la actividad en la tabla en el Publicador y los Suscriptores, y propagar a todos los nodos los cambios de datos pendientes antes de realizar cualquier cambio en el esquema. Este proceso garantiza que las transacciones pendientes no entren en conflicto con el cambio pendiente del esquema. Una vez que los cambios en el esquema se propaguen a todos los nodos, la actividad puede reanudar en las tablas publicadas. Para más información, vea Poner en modo inactivo una topología de replicación (programación de la replicación con Transact-SQL).

  • Para cambiar entre modos de actualización, el Agente Lector de Colas debe ejecutarse al menos una vez después de que se inicialice la suscripción (por defecto, el Agente Lector de Colas se ejecuta de forma continua).

  • Si la base de datos de Suscriptores está particionada horizontalmente y hay filas en la partición que existen en el Suscriptor pero no en el Publisher, el Suscriptor no puede actualizar las filas preexistentes. Si intenta actualizar estas filas, se obtendrá un error. Elimina las filas de la tabla y luego añádelas en el Publisher.

  • La replicación transaccional con suscriptores actualizables en cola puede experimentar un rendimiento lento cuando se utilizan índices filtrados únicos. Si ocurre un conflicto en un artículo que tiene índices filtrados únicos, la resolución de conflictos provoca eliminaciones e inserciones adicionales en el suscriptor para las filas que no quedan cubiertas por el índice filtrado único.

Actualizaciones en el suscriptor

  • Las actualizaciones en el Suscriptor se propagan al Publisher incluso si una suscripción está caducada o inactiva. Asegúrate de cancelar o reiniciar cualquiera de esas suscripciones.

  • Si usa columnas TIMESTAMP o IDENTITY y las replica como sus tipos de datos base, no actualice los valores de estas columnas en el Suscriptor.

  • Los suscriptores no pueden actualizar ni insertar texto, ntext o valores de imagen porque los disparadores de seguimiento de cambios de replicación no pueden leer de las tablas insertadas o eliminadas. De manera similar, los suscriptores no pueden actualizar ni insertar valores de texto o imagen usando WRITETEXT o UPDATETEXT porque el Publisher sobrescribe los datos. En su lugar, podrías particionar las columnas de texto e imagen en una tabla separada y modificar ambas tablas dentro de una transacción.

    Para actualizar objetos grandes en un Suscriptor, utiliza los tipos de datos varchar(max),nvarchar(max) y varbinary(max) en lugar de texto, ntexte imágenes , respectivamente.

  • No se permiten actualizaciones de claves únicas (incluidas las claves primarias) que generan duplicados, como una actualización del formulario UPDATE <column> SET <column> =<column>+1, y se rechazan por una violación de la unicidad. Las actualizaciones de conjunto realizadas en el Suscriptor se propagan por replicación como sentencias individuales UPDATE para cada fila afectada.

  • Si la base de datos de Suscriptores está particionada horizontalmente y contiene filas que existen en el Suscriptor pero no en el Publisher, el Suscriptor no puede actualizar las filas preexistentes. Si intenta actualizar estas filas, se obtendrá un error. Elimina y vuelve a insertar estas filas.

Desencadenadores definidos por el usuario

  • Si la aplicación requiere desencadenadores en el Suscriptor, defina los desencadenadores con la opción NOT FOR REPLICATION en el Publicador y el Suscriptor. Esta opción garantiza que los disparos se activen solo para el cambio original de datos, pero no cuando la replicación propaga el cambio.

    Asegúrate de que el disparador definido por el usuario no se active cuando el disparador de replicación actualice la tabla. Llame al procedimiento sp_check_for_sync_trigger en el cuerpo del desencadenador definido por el usuario. Para obtener más información, consulte sp_check_for_sync_trigger (Transact-SQL).

Actualización inmediata

  • Para suscripciones de actualización inmediata, los cambios en el Suscriptor se propagan al Publisher y se aplican utilizando Coordinador de transacciones distribuidas de Microsoft (MS DTC). Asegúrese de que MS DTC se ha instalado y configurado en el publicador y en el suscriptor. Para obtener más información, consulte la documentación de Windows.

  • Los desencadenadores que utilizan las suscripciones de actualización inmediata requieren una conexión con el Publicador para replicar los cambios.

  • Si la publicación permite suscripciones que se actualizan inmediatamente y un artículo tiene un filtro de columnas, no puedes filtrar columnas no anulables sin valores predeterminados.

Actualización en cola

  • No puedes publicar tablas incluidas en una publicación de fusión como parte de una publicación transaccional que permita suscripciones de actualización en cola.

  • No actualices las columnas de clave primaria cuando uses la actualización en cola porque la clave primaria sirve como localizador de registros para todas las consultas. Cuando la política de resolución de conflictos esté configurada como Victorias de Suscriptores, ten cuidado al actualizar las claves primarias. Si tanto el Publisher como el Suscriptor actualizan la clave primaria, el resultado son dos filas con claves primarias diferentes.

  • Las columnas con el tipo de datos SQL_VARIANT: cuando se insertan o actualizan datos en el Suscriptor, el Agente Lector de cola los asigna de la siguiente manera al copiar los datos del Suscriptor a la cola:

    • BIGINT, DECIMAL, NUMERIC, MONEY y SMALLMONEY se asignan a NUMERIC.

    • BINARY y VARBINARY se mapean a datos VARBINARY .

Detección y resolución de conflictos

  • Para la política de conflictos en la que el suscriptor tiene prioridad: la resolución de conflictos no admite actualizaciones en las columnas de clave principal.

  • La replicación no resuelve conflictos debidos a fallos en restricciones de clave extranjera:

    • Si no esperas conflictos y los datos están bien particionados (los Suscriptores no actualizan las mismas filas), usa restricciones de clave externa en el Publicador y los Suscriptores.

    • Si esperas conflictos: no uses restricciones de clave extranjera en el Publisher o en el Suscriptor si usas la resolución de conflictos "El suscriptor gana". No uses restricciones de clave extranjera en el Suscriptor si usas la resolución de conflictos "Publisher gana".