Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como sincronizar dados de uma tabela entre bases diferentes utilizando Trigger

Visualizações: 2.998 views
Tempo de Leitura: 4 minutos

Fala pessoal!
Nesse post de hoje eu vou trazer uma solução bem simples, mas que resolveu um problema de uma pessoa que me pediu ajuda para sincronizar dados de uma tabela entre bases diferentes, na mesma instância, da forma mais simples possível, onde você insere, atualiza ou apaga dados da tabela de origem e todas as alterações são replicadas para uma tabela espelho em outra base.

Como o foco da solução é ser rápida, simples, funcionar em qualquer versão e edição do SQL Server, não exigir um Job para ficar atualizando, tendo os dados atualizados quase que eu tempo real e são apenas algumas poucas tabelas ao invés da base inteira, pensei que a melhor solução para esse cenário é utilizar Triggers.

Existem outras soluções para resolver esse problema de replicar dados entre bases diferentes? Com certeza!

  • Change Data Capture: É rápido, é simples de usar, mas não funciona em qualquer edição do SQL Server e armazena todas as alterações numa base de histórico (sem necessidade nesse caso).
  • Temporal Tables: É rápido, é simples, mas só funciona a partir do SQL Server 2016, vai exigir um job para sincronizar os dados
  • Always On availability group: Não será fácil de implementar e nem rápido. Não vai replicar apenas algumas tabelas e sim a base toda e não funciona em todas as versões do SQL Server
  • Replicação: Não será fácil de implementar e nem rápido, mas atende aos requisitos de funcionar em todas as versões e edições do SQL Server, não exige um job, os dados são atualizados quase que em tempo real e dá para replicar apenas algumas tabelas

Criação das tabelas origem e espelho

Trigger que vai espelhar a tabela original

Com a trigger abaixo, vou replicar todas as operações de INSERT, UPDATE e DELETE feitas na tabela original para a tabela espelho.

Lembre-se de que se você alterar a estrutura da tabela de origem, como uma nova coluna, remover/renomear colunas existentes, por exemplo, você deverá sempre aplicar as mesmas alterações na tabela espelhada. Caso contrário, isso irá gerar erros na execução da trigger, a não ser que você altere o código da trigger para especificar exatamente o nome das colunas no INSERT e inclua as alterações também no UPDATE.

Testando a solução

Vamos agora testar se a trigger realmente está funcionando conforme o esperado.

Vou inserir 10 linhas aleatórias na tabela dbo.Vendas no database Base1:

Resultado:

Agora vou fazer um UPDATE na tabela original:

Resultado:

E por fim, terminar os testes com um DELETE na tabela original:

Resultado:

ATENÇÃO: Essa trigger será executada a cada INSERT/UPDATE/DELETE realizado na tabela original. Isso quer dizer que se você executar uma operação de DML em massa, como inserir um bloco de linhas ou fazer um update na tabela toda, por exemplo, cada linha afetada irá disparar uma execução da trigger, o que pode deixar o processo em si muito mais lento. Tenha cuidado ao usar trigger de DML por conta disso.

E é isso aí, pessoal!
Espero que tenham gostado dessa dica supersimples, mas que pode ajudar bastante gente no dia a dia com uma solução simples, mas que funciona 🙂