As instruções UPDATE podem ser replicadas como pares DELETE/INSERT
Este artigo descreve que as instruções de atualização podem ser replicadas como pares DELETE/INSERT.
Versão original do produto: SQL Server
Número de KB original: 238254
Resumo
Se qualquer coluna que faz parte de uma restrição exclusiva for atualizada, SQL Server implementará a atualização como uma "atualização adiada", o que significa como um par de DELETE
/INSERT
operações. Essa "atualização adiada" faz com que a replicação envie um par de DELETE
/INSERT
instruções aos assinantes. Há também outras situações que podem causar uma atualização adiada. Portanto, qualquer lógica de negócios que você implementar em seus UPDATE
gatilhos ou procedimentos armazenados personalizados no Assinante também deve ser incluída nos DELETE
/INSERT
gatilhos ou procedimentos armazenados personalizados.
Mais informações
O comportamento padrão na replicação transacional é usar INSERT
e UPDATE
DELETE
procedimentos armazenados personalizados para aplicar alterações nos assinantes.
INSERT
as instruções feitas no Publisher são aplicadas aos assinantes por meio de uma INSERT
chamada de procedimento armazenada. Da mesma forma, uma DELETE
instrução é aplicada por meio de uma DELETE
chamada de procedimento armazenado.
No entanto, quando uma instrução UPDATE
é executada como uma "atualização adiada", o agente logreader coloca um par de chamadas de procedimento armazenadas no banco de DELETE
/INSERT
dados de distribuição a serem aplicadas aos Assinantes em vez de uma chamada de procedimento armazenado de atualização. Por exemplo, suponha que você tenha uma tabela de publicação chamada TABLE1
, com estas três colunas:
- col1 int
- col2 int
- col3 varchar(30)
A única restrição exclusiva em TABLE1
é definida por col1
meio de uma restrição de chave primária. Suponha que você tenha um recorde (1,1,'Dallas').
Ao executar este código:
UPDATE TABLE1 set col1 = 3 where col3 = 'Dallas'
A UPDATE
instrução é implementada por SQL Server como um par deINSERT
DELETE
/instruções desde que você está atualizando col1
, que tem um índice exclusivo definido. Assim, o logreader coloca um par de chamadas no banco de dados de DELETE
/INSERT
distribuição. Isso pode afetar qualquer lógica de negócios presente nos gatilhos ou nos procedimentos armazenados personalizados no Assinante. Você deve incorporar a lógica comercial adicional e DELETE
INSERT
dispara ou procedimentos armazenados para lidar com essa situação.
Se preferir usar a lógica única e desejar que todos os comandos UPDATE
sejam replicados como DELETE
/INSERT
pares, você poderá habilitar um sinalizador de rastreamento.
Além disso, se você usar um filtro horizontal em sua publicação e se a linha atualizada não atender a uma condição de filtro, apenas uma DELETE
chamada de procedimento será enviada aos assinantes. Se a linha atualizada anteriormente não atendesse à condição de filtro, mas atendesse à condição após a atualização, somente a chamada de INSERT
procedimento será enviada por meio do processo de replicação.
No exemplo anterior, suponha que você também tenha um filtro horizontal definido em TABLE1
: where col3 = 'Dallas'
. Se você executar este código:
UPDATE table1 set col3 = 'New York' where col1 = 3
o agente logreader só coloca uma DELETE
chamada de procedimento armazenado a ser aplicada aos assinantes, uma vez que a linha atualizada não atende aos critérios de filtro horizontal.
Agora, se você executar este código:
UPDATE table1 set col3 = 'Dallas' where col1 = 3
o logreader gera apenas a chamada de INSERT
procedimento armazenado, já que a linha não cumpriu anteriormente a condição de filtro.
Embora uma UPDATE
operação tenha sido executada no Publisher, apenas os comandos apropriados são aplicados no Assinante.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários