Qual è la differenza tra `ALTER TABLE DISABLE TRIGGER` e `DISABLE TRIGGER`?

Aug 27 2020

La mia azienda registra DDL su un database utilizzando un trigger di database, cercando DDL tra cui:

  • ALTER_TABLE
  • CREATE_TRIGGER
  • ALTER_TRIGGER
  • DROP_TRIGGER

Quando disabilito o abilito i trigger utilizzando ALTER TABLE x DISABLE TRIGGER tiud_x, questa modifica viene registrata con il trigger del database.

Quando disabilito o abilito i trigger utilizzando DISABLE TRIGGER tiud_x ON x, questa modifica non viene registrata.

Per me, DISABLE TRIGGERe ENABLE TRIGGERsembra "uno strano trucco" per evitare di attivare un trigger di database, poiché sembrano funzionalmente equivalenti. Qual è la differenza tra ALTER TABLE DISABLE TRIGGERe DISABLE TRIGGER?

Risposte

AaronBertrand Aug 28 2020 at 03:05

Purtroppo:

  1. Disattivare un grilletto non sta alterando il grilletto, proprio come spegnere una luce non sta alterando la lampadina. Tuttavia è divertente che non venga catturato da ALTER_TRIGGERma qualcosa riesce comunque ad aggiornarsi modify_datequando succede. ¯\- (ツ)-

  2. Il tuo trigger DDL cattura la ALTER TABLEvariazione perché sta alterando esplicitamente la tabella - lo dice nel comando. Mentre potresti sostenere che disabilitare il trigger sta alterando la tabella indipendentemente dalla sintassi che usi (e sarei d'accordo con te, soprattutto perché il risultato netto è lo stesso), la differenza è che questa è attualmente una lacuna in ciò che i trigger DDL catturano e non c'è alcun DISABLE_TRIGGERevento (puoi votare affinché lo risolvano in questo elemento di feedback su UserVoice , ma è stato completamente ignorato per oltre un decennio). Ecco una domanda correlata e comprensibilmente senza risposta su Stack Overflow .

    Allo stesso modo, molto tempo fa ricordo che gli ALTER_eventi non sono stati catturatiRENAME, e questo è stato aggiunto come evento in seguito.

Dovrai catturare DISABLE TRIGGERin altri modi, come audit o eventi estesi (ne ho parlato qui):

  • Quando un trigger di tabella è stato disabilitato e riattivato?

In tal caso, puoi anche acquisire la ALTER TABLEvariazione allo stesso modo in modo che siano entrambi registrati nello stesso posto.

Un'idea davvero stupida sarebbe quella di eseguire il polling sys.triggersogni n secondi/minuti/ore e registrare ogni volta che lo stato delle is_disabledmodifiche. Questo non ti permetterà di vedere chi è stato, ma almeno saprai che è successo e, insieme ad altri auditing, potresti essere in grado di restringere il campo.