Eu tenho replicação de transação entre dois SQL Servers. Para fins de teste, apaguei muitos registros no assinante que ainda existiam no editor.
Agora sei que, se alguém atualizar ou excluir alguns registros no editor, que não existem no meu assinante, minha replicação falhará.
Sei que também poderia filtrar dados no distribuidor, mas isso significaria reinicializar meus assinantes e isso significaria transferir quase 40 GB por um link lento.
Portanto, enquanto estou testando meu banco de dados inscrito, adoraria restringir os usuários a apenas atualizar ou excluir registros no lado do editor. Minha tabela de origem possui um campo de data e desejo restringir atualizações ou exclusões de acordo com a data.
É melhor usar um gatilho ou uma restrição para isso?
Como posso evitar o máximo de bloqueio de registro possível?
Uma restrição não pode controlar as operações DML, a menos que a atualização realmente tente alterar os dados nessa coluna. Certamente não pode controlar exclusões, a menos que estejamos falando sobre restrições em nível de tabela, mas eu não recomendo isso.
A maioria das pessoas segue os gatilhos para esse tipo de lógica, mas isso significa (a) tentar realizar a alteração (b) se ela falhar em sua lógica, reverta-a. Eu prefiro muito mais um gatilho INSTEAD OF para isso. O seguinte permitirá atualizações/exclusões apenas para linhas que se enquadram em seu período de data (é claro que você terá que substituir as strings de 'período de data' por datas reais), mesmo que uma operação de várias linhas possa afetar algumas linhas, mas não outras.