Qual è la differenza tra `ALTER TABLE DISABLE TRIGGER` e `DISABLE TRIGGER`?
La mia azienda registra DDL su un database utilizzando un trigger di database, cercando DDL tra cui:
ALTER_TABLECREATE_TRIGGERALTER_TRIGGERDROP_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
Purtroppo:
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 aggiornarsimodify_datequando succede. ¯\- (ツ)- /¯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'è alcunDISABLE_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 gliALTER_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.