Arquivo de fevereiro \04\UTC 2010

Desbalanceamento de Bancos replicados

Já tem uns 8 meses que esse problema que tive foi resolvido, mas, como não tinha blog na época, não escrevi nada.

Essa solução se aplica ao Microsoft SQL Server.

Quando você tem bancos de dados numa replicação do tipo Merge (ou Mesclagem, para quem usa em português), qualquer alteração feita no publicador ou no assinante é replicada, fazendo com que as tabelas afetadas dos dois lados fiquem sempre com o mesmo conteúdo.

O problema que eu tinha se devia ao fato de ter 3 assinantes colocando dados numa tabela replicada no banco de dados do Servidor Central. Assim, como o volume de dados era grande (50 linhas, com imagens, por assinante sendo criadas por minuto, 24 hs por dia), a única opção era mesmo usar uma replicação do tipo Merge, já que Snapshot e Trasacional seriam inviáveis.

Chegou um momento, depois de vários meses com o sistema rodando, que o espaço físico do HD dos assinantes começou a ficar pequeno e, como o Servidor Central já guardava todos os dados, surgiu a idéia de limpar os bancos dos assinantes mensalmente para não ter problemas de falta de espaço.

Num mundo ideal, compraríamos HDs maiores, mas a realidade é outra.

Depois de muita procura, vários sites diziam que “O MICROSOFT SQL SERVER NÃO PERMITE QUE OS BANCOS DE DADOS NUMA REPLICAÇÃO DO TIPO MERGE FIQUEM DESBALANCEADOS!”.

Como assim, ele agora diz o que eu posso e não posso colocar no meu banco de dados?

Lendo a documentação da Microsoft sobre o funcionamento da replicão Merge, vemos que sempre que há uma mudança numa tabela a partir de um INSERT, UPDATE ou DELETE, um trigger é disparado para que esse dado seja replicado.

Bem, aí está a solução!

Olhando os triggers da tabela replicada estavam lá os três códigos SQL que garantiam o que os sites diziam sobre o desbalanceamento! O código relacionado à ação de deletar só precisava ser eliminado.

Para garantir que nenhum erro acontecesse, caso o trigger de DELETE fosse apagado, tomamos uma providência bem simples que consistia em colocar um ‘return‘ logo no início do código, fazendo com que o trigger seja executado quando uma linha é deletada, mas não replicando a ação.

[Update] O SQL Server 2008 permite desabilitar um trigger ao clicar com o botão direito nele. É uma solução mais limpa e inteligente.

Problema resolvido, bancos desbalanceados, mais espaço no HD e outro cliente feliz.