Quand les triggersurs triggersnt-ils et quand ne le font-ils pas?

Question assez générale concernant les triggersurs dans SQL Server 2005.

Dans quelles situations les triggersurs de table sont-ils tirés et quelles sont les situations qui ne le sont pas?

Tout exemple de code à démontrer serait génial.

J'écris une database basée sur l'audit et je veux juste être au courant de toutes les situations qui pourraient ne pas triggersr les triggersurs que j'ai mis en place pour la mise à jour, supprimer et insert sur mes tables.

Un exemple de ce que je veux dire,

UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3); 

L'instruction suivante triggers uniquement le triggersur de mise à jour une fois.

Quand voulez-vous qu'ils tirent?

 CREATE TRIGGER AFTER ACTION 

Cela s'exécute après l'action ( insert update delete ) en cours de validation. INSTEAD OF lieu de triggersr le triggersur à la place de l'action.

L'un des plus gros problèmes avec les triggersurs est qu'ils se triggersnt lorsqu'une action est effectuée, même si aucune ligne n'est affectée . Ce n'est pas un bug, et c'est quelque chose qui peut vous brûler assez rapidement si vous ne faites pas attention.

En outre, avec les triggersurs, vous utiliserez les tables inserted et deleted . Les lignes mises à jour sont répertoriées dans les deux. Cela jette beaucoup de gens, parce qu'ils ne sont pas habitués à penser à une update à update tant que delete puis insert .

La documentation MSDN contient en fait une discussion assez approfondie sur le moment où les triggersurs se triggersnt et l'effet qu'ils ont ici .

Sur 2008, vous pouvez utiliser embedded dans la capture de données de changement

Il y a aussi quelques situations où les triggersurs ne se triggersnt pas, tels que:

· Une table est supprimée.

· Une table est tronquée.

· Les parameters des triggersurs nesteds et / ou récursifs empêchent le triggersment d'un triggersur.

· Les données sont chargées en masse, en ignorant les triggersurs.

L'instruction suivante triggers uniquement le triggersur de mise à jour une fois.

Toute instruction de type action triggers uniquement le triggersur une fois le nombre de lignes affectées, les triggersurs doivent être écrits pour gérer plusieurs insertions / mises à jour / suppressions de lignes.

Si votre triggersur ne dépend que d'une ligne à la fois dans les pseudotables insérés ou supprimés, il échouera. Et pire, cela n'échouera pas avec une erreur, cela n'affectera tout simplement pas toutes les lignes que vous voulez affecter, quel que soit le triggersur. Ne fixez pas ceci à travers une boucle ou un slider dans un triggersur, passez à la logique basée sur les sets. Un slider dans un triggersur peut entraîner une interruption brutale de l'set de votre application pendant qu'une transaction de 500 000 loggings traite et verrouille la table pendant des heures.

Insère en bloc les triggersurs de passage sauf si vous spécifiez de les utiliser. Soyez conscient de cela parce que si vous les laissez passer le triggersur, vous aurez besoin de code pour vous assurer que tout ce qui se passe dans le triggersur se produit également après l'insertion en bloc. Ou vous devez appeler les insertions en masse avec l'option FIRE_TRIGGERS.

Je pensais mettre en évidence à partir du lien Eric posté une situation dans laquelle un triggersur ne se triggersrait pas:

Bien qu'une instruction TRUNCATE TABLE soit en fait un DELETE, elle ne peut pas activer un triggersur car l'opération n'enregistre pas les suppressions de ligne individuelles. Toutefois, seuls ceux qui ont des permissions sur une table pour exécuter une table TRUNCATE doivent se préoccuper de contourner par inadvertance un triggersur DELETE avec une instruction TRUNCATE TABLE.