Qual é a diferença entre `ALTER TABLE DISABLE TRIGGER` e `DISABLE TRIGGER`?
Minha empresa registra DDL em um banco de dados usando um acionador de banco de dados, procurando por DDL, incluindo:
ALTER_TABLECREATE_TRIGGERALTER_TRIGGERDROP_TRIGGER
Quando desabilito ou habilito triggers usando ALTER TABLE x DISABLE TRIGGER tiud_x, essa alteração é registrada com o Database Trigger.
Quando desabilito ou habilito gatilhos usando DISABLE TRIGGER tiud_x ON x, essa alteração não é registrada.
Para mim, DISABLE TRIGGERe ENABLE TRIGGERparece "um truque estranho" para evitar disparar um gatilho de banco de dados, pois eles parecem ser funcionalmente equivalentes. Qual é a diferença entre ALTER TABLE DISABLE TRIGGERe DISABLE TRIGGER?
Respostas
Infelizmente:
Desativar um gatilho não altera o gatilho, assim como desligar uma luz não altera a lâmpada. No entanto, é engraçado que não seja capturado,
ALTER_TRIGGERmas algo ainda consegue atualizarmodify_datequando isso acontece. ¯\- (ツ)- /¯Seu gatilho DDL captura a
ALTER TABLEvariação porque isso está alterando explicitamente a tabela - diz isso no comando. Embora você possa argumentar que desabilitar o gatilho está alterando a tabela, independentemente da sintaxe que você usa (e eu concordaria com você, especialmente porque o resultado líquido é o mesmo), a diferença é que isso é atualmente uma lacuna no que os gatilhos DDL capturam , e não há nenhumDISABLE_TRIGGERevento (você pode votar neles para corrigi-lo neste item de feedback no UserVoice , mas isso está lá completamente ignorado há mais de uma década). Aqui está uma pergunta relacionada e compreensivelmente não respondida no Stack Overflow .
Da mesma forma, há muito tempo eu me lembro que osALTER_eventos não capturavamRENAME, e isso foi adicionado como um evento posteriormente.
Você terá que pegar DISABLE TRIGGERde outras maneiras, como auditoria ou Eventos Estendidos (falei sobre isso aqui):
- Quando um gatilho de tabela foi desativado e reativado?
Nesse caso, você também pode capturar a ALTER TABLEvariação da mesma maneira para que ambas sejam registradas no mesmo local.
Uma ideia realmente idiota seria pesquisar a sys.triggerscada n segundos/minutos/horas e registrar sempre que o estado is_disabledmudar. Isso não permitirá que você veja quem fez isso, mas pelo menos você saberá o que aconteceu e, junto com outras auditorias, poderá reduzi-lo.