Las instrucciones UPDATE se pueden replicar como pares DELETE/INSERT

En este artículo se describe que las instrucciones Update se pueden replicar como pares DELETE/INSERT.

Versión del producto original: SQL Server
Número de KB original: 238254

Resumen

Si se actualiza cualquier columna que forma parte de una restricción única, SQL Server implementa la actualización como una "actualización diferida", lo que significa como un par de DELETE/INSERT operaciones. Esta "actualización diferida" hace que la replicación envíe un par de DELETE/INSERT instrucciones a los suscriptores. También hay otras situaciones que pueden provocar una actualización diferida. Por lo tanto, cualquier lógica de negocios que implemente en UPDATE los desencadenadores o procedimientos almacenados personalizados en el suscriptor también debe incluirse en los DELETE/INSERT desencadenadores o procedimientos almacenados personalizados.

Más información

El comportamiento predeterminado en la replicación transaccional es usar INSERTy UPDATEDELETE procedimientos almacenados personalizados para aplicar cambios en los suscriptores.

INSERT Las instrucciones realizadas en el publicador se aplican a los suscriptores a través de una INSERT llamada a procedimiento almacenado. De forma similar, una DELETE instrucción se aplica a través de una llamada a procedimiento DELETE almacenado.

Sin embargo, cuando una UPDATE instrucción se ejecuta como una "actualización diferida", el agente de logreader coloca un par de llamadas a procedimientos almacenados en la base de DELETE/INSERT datos de distribución que se aplicarán a los suscriptores en lugar de una llamada de procedimiento almacenado de actualización. Por ejemplo, supongamos que tiene una tabla de publicación, denominada TABLE1, con estas tres columnas:

  • col1 int
  • col2 int
  • col3 varchar(30)

La única restricción única en TABLE1 se define en col1 mediante una restricción de clave principal. Supongamos que tiene un registro (1,1, 'Dallas').

Al ejecutar este código:

UPDATE TABLE1 set col1 = 3 where col3 = 'Dallas'

La UPDATE instrucción se implementa mediante SQL Server como un par deINSERTDELETE/instrucciones, ya que está actualizando col1, que tiene un índice único definido. Por lo tanto, el logreader coloca un par de llamadas en la base de DELETE/INSERT datos de distribución. Esto puede afectar a cualquier lógica de negocios que esté presente en los desencadenadores o procedimientos almacenados personalizados en el suscriptor. Debe incorporar la lógica de negocios adicional en DELETE y INSERT desencadenadores o procedimientos almacenados para controlar esta situación.

Si prefiere usar una sola lógica y quiere que todos los UPDATE comandos se repliquen como DELETE/INSERT pares, puede habilitar una marca de seguimiento.

Además, si usa un filtro horizontal en la publicación y la fila actualizada no cumple una condición de filtro, solo se envía una DELETE llamada de procedimiento a los suscriptores. Si la fila actualizada anteriormente no cumplía la condición de filtro pero cumple la condición después de la actualización, solo se envía la INSERT llamada al procedimiento a través del proceso de replicación.

En el ejemplo anterior, suponga que también tiene un filtro horizontal definido en TABLE1: where col3 = 'Dallas'. Si ejecuta este código:

UPDATE table1 set col3 = 'New York' where col1 = 3

El agente de logreader solo realiza una llamada a procedimiento DELETE almacenado para que se aplique a los suscriptores, ya que la fila actualizada no cumple los criterios de filtro horizontal.

Ahora, si ejecuta este código:

UPDATE table1 set col3 = 'Dallas' where col1 = 3

el logreader genera solo la llamada al INSERT procedimiento almacenado, ya que la fila no cumplió previamente la condición de filtro.

Aunque se realizó una UPDATE operación en el publicador, solo se aplican los comandos adecuados en el suscriptor.