Qual é a diferença entre `ALTER TABLE DISABLE TRIGGER` e `DISABLE TRIGGER`?

Aug 27 2020

Minha empresa registra DDL em um banco de dados usando um acionador de banco de dados, procurando por DDL, incluindo:

  • ALTER_TABLE
  • CREATE_TRIGGER
  • ALTER_TRIGGER
  • DROP_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

AaronBertrand Aug 28 2020 at 03:05

Infelizmente:

  1. 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 atualizar modify_datequando isso acontece. ¯\- (ツ)-

  2. 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á nenhum DISABLE_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 os ALTER_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.