Quelle est la différence entre `ALTER TABLE DISABLE TRIGGER` et` DISABLE TRIGGER`?

Aug 27 2020

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

AaronBertrand Aug 28 2020 at 03:05

Malheureusement:

  1. 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 à jour modify_datequand cela se produit. ¯ \ - (ツ) - / ¯

  2. 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 aucun DISABLE_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 les ALTER_é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.