Quelle est la différence entre `ALTER TABLE DISABLE TRIGGER` et` DISABLE TRIGGER`?
Mon entreprise enregistre DDL sur une base de données à l'aide d'un déclencheur de base de données, à la recherche de DDL, notamment:
ALTER_TABLECREATE_TRIGGERALTER_TRIGGERDROP_TRIGGER
Lorsque je désactive ou active des déclencheurs à l'aide de ALTER TABLE x DISABLE TRIGGER tiud_x, cette modification est enregistrée avec le déclencheur de base de données.
Lorsque je désactive ou active des déclencheurs à l'aide de DISABLE TRIGGER tiud_x ON x, cette modification n'est pas enregistrée.
Pour moi, DISABLE TRIGGERet cela ENABLE TRIGGERressemble à "un truc bizarre" pour éviter de déclencher un déclencheur de base de données, car ils semblent être fonctionnellement équivalents. Quelle est la différence entre ALTER TABLE DISABLE TRIGGERet DISABLE TRIGGER?
Réponses
Malheureusement:
La désactivation d'un déclencheur ne modifie pas le déclencheur, tout comme éteindre une lumière ne modifie pas l'ampoule. Cependant, il est amusant que cela ne soit pas capturé par
ALTER_TRIGGERmais que quelque chose parvient toujours à se mettre à jourmodify_datequand cela se produit. ¯ \ - (ツ) - / ¯Votre déclencheur DDL attrape la
ALTER TABLEvariation car cela modifie explicitement la table - il le dit dans la commande. Bien que vous puissiez affirmer que la désactivation du déclencheur modifie la table quelle que soit la syntaxe que vous utilisez (et je serais d'accord avec vous, d'autant plus que le résultat net est le même), la différence est qu'il s'agit actuellement d'un écart dans ce que les déclencheurs DDL capturent , et il n'y a aucunDISABLE_TRIGGERévénement (vous pouvez voter pour qu'ils le résolvent dans cet élément de commentaires sur UserVoice , mais cela est resté complètement ignoré depuis plus d'une décennie). Voici une question connexe, naturellement sans réponse, sur Stack Overflow .
De même, il y a longtemps, je me souviens que lesALTER_événements n'ont pas capturéRENAME, et cela a été ajouté en tant qu'événement plus tard.
Vous devrez attraper DISABLE TRIGGERd'autres manières, comme l'audit ou les événements étendus (j'en ai parlé ici):
- Quand un déclencheur de table a-t-il été désactivé et réactivé?
Dans ce cas, vous pouvez également capturer la ALTER TABLEvariation de la même manière afin qu'ils soient tous les deux enregistrés au même endroit.
Une idée vraiment stupide serait d'interroger sys.triggerstoutes les n secondes / minutes / heures et d'enregistrer chaque fois que l'état des is_disabledchangements. Cela ne vous permettra pas de voir qui l'a fait, mais au moins vous saurez que cela s'est produit et, avec d'autres audits, vous pourrez peut-être le réduire.