Question

question assez générale concernant les déclencheurs dans SQL Server 2005.

Dans quelles situations sont des déclencheurs de table tirés et quelles situations sont-ils pas?

Les exemples de code pour démontrer serait grande.

J'écris une base de données sur la base d'audit et que vous voulez juste être au courant des situations qui pourraient ne pas tirer au large des déclencheurs que j'ai mis en place pour la mise à jour, supprimer et insérer sur mes tableaux.

Un exemple de ce que je veux dire,

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

La déclaration suivante se déclenche que le déclencheur de mise à jour une fois.

Était-ce utile?

La solution

Quand voulez-vous les au feu?

CREATE TRIGGER AFTER ACTION

Ce court après l'action (insert update delete) commis. INSTEAD OF déclenche la gâchette en place de l'action.

L'un des plus grands déclencheurs est avec gotchas qu'ils se déclenchent chaque fois qu'une action est effectuée, même si aucune ne l'est . Ce n'est pas un bug, et il est quelque chose qui peut vous brûler assez rapidement si vous ne faites pas attention.

En outre, avec des déclencheurs, vous utiliserez les tables de inserted et deleted. lignes mises à jour sont répertoriés dans les deux. Cela jette beaucoup de gens hors, parce qu'ils ne sont pas habitués à penser à un update comme delete puis insert.

La documentation MSDN a fait une jolie discussion approfondie sur le moment où déclenche le feu et quel effet ils ont ici .

Autres conseils

En 2008, vous pouvez utiliser construit dans Change Data Capture

Il y a aussi un bon nombre de situations où ne se déclenchent pas, comme:

• Une table est supprimée.

· Une table est tronquée.

· Réglages pour déclencheurs imbriqués et / ou récursifs empêchent un déclencheur de tir.

· Les données sont chargées en vrac, sans passer par les déclencheurs.

  

La déclaration suivante se déclenche que le déclencheur de mise à jour une fois.

Toute déclaration de type d'action que les feux de la détente une fois, peu importe le nombre de lignes sont affectées, les déclencheurs doivent être écrits pour gérer plusieurs insertions de ligne / mises à jour / supprime.

Si votre déclenchement ne dépend que d'une ligne à la fois être dans les insérées ou supprimées pseudo-tables, il échouera. Et pire, il ne manquera pas d'une erreur, il sera tout simplement pas affecter toutes les lignes que vous voulez touchés par quel que soit le déclencheur fait. Ne pas résoudre ce problème à travers une boucle ou un curseur dans un déclencheur, changer la logique à base réglée. Un curseur dans un déclencheur peut apporter votre application entière arrété alors qu'une transaction de 500.000 processus enregistre et verrouille la table pendant des heures.

inserts en vrac par passage déclenche à moins que vous spécifiez pour les utiliser. Soyez conscient de cela parce que si vous les laissez passer par la détente, vous aurez besoin du code pour vous assurer que tout ce qui se passe dans le déclenchement se produit également après l'insertion en vrac. Ou vous avez besoin d'appeler les inserts en vrac avec l'option FIRE_TRIGGERS.

Je pensais souligner le lien Eric publié une situation dans laquelle un déclencheur ne serait pas le feu:

  

Bien qu'une instruction TRUNCATE TABLE est en effet un SUPPRIMER, il ne peut pas activer un déclencheur, car l'opération ne se connecte pas des suppressions de lignes individuelles. Cependant, seuls ceux qui ont des autorisations sur une table pour exécuter une TRUNCATE TABLE besoin d'être préoccupé par inadvertance contourner un déclencheur SUPPRIMER avec une instruction TRUNCATE TABLE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top