10
votes

Quand déclenche-t-on le feu et quand ne-même pas

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 sont-elles?

Tous les exemples de code à démontrer seraient super.

J'écris une base de données basée sur l'audit et je veux juste être au courant des situations qui pourraient ne pas tirer parti des déclencheurs que j'ai mis en place pour mettre à jour, supprimer et insérer sur mes tables.

Un exemple de ce que je veux dire, xxx

L'instruction suivante déclenche uniquement la mise à jour de la gâchette une fois.


1 commentaires

J'ai appris maintenant qu'ils ne tirent pas sur Truncate - Stackoverflow.com/ Questions / 2234223 / SQL-Trigger-sur-tronquée


4 Réponses :


21
votes

Quand voulez-vous qu'ils tirent?

CREATE TRIGGER AFTER ACTION


8 commentaires

Pouvez-vous donner un exemple qui montre comment un déclencheur peut créer des problèmes lorsque aucune ligne de lignes n'est affectée? Merci.


Jetez un coup d'œil à celui-ci: sqlfiddle.com/#!6/be3d3/3. J'ai vu des déclencheurs prévus de tirer des emails aux gens. Si vous avez un processus qui insère ou met à jour des enregistrements qui affectent rarement une ligne, mais simplement le sondre, cela peut vous brûler assez rapidement. Vérifiez toujours si les lignes ont été affectées dans vos déclencheurs, en règle générale!


Je sais que c'est vieux, mais je viens de voter pour expliquer la mise à jour à la fois insérée et supprimée. Cela a sauvé mon bacon après avoir combattu pendant quelques heures avec mon design de déclenchement.


Un déclencheur a-t-il créé par 'Créer une gâchette après insertion ...' Fire lorsque "Mettre à jour" est effectuée? Vous mentionnez update est un Supprimer puis insérer donc je pensais que c'était, mais il n'y a pas de mention explicite de cela.


@Johncarpenter - Non - l'action est conforme au verbe SQL qui a été émise. Ce qu'il voulait dire était chaque fois que nous disons "mise à jour", SQL Server conserve une copie "avant" (table supprimée) et une copie "après" (table insérée) qui correspond au schéma du tableau que vous avez mis à jour. Ces tables (insérées, supprimées) ne sont disponibles que dans la mise à jour (et donc, à l'intérieur de la gâchette elle-même). Chaque déclencheur ne tirera que lorsque vous le direz (par exemple, insérer, mettre à jour ou supprimer).


@JOHNCARPENTER - Je devrais aussi mentionner: l'action insertion inclut la table insérée (aka, pseudotable) et l'action Supprene inclut la table supprimée. Seule la mise à jour a les deux (car il y a toujours un «avant» et «après» lors d'une mise à jour).


J'ai découvert que si vous avez deux déclencheurs sur une seule table, il incendie sur Insert et un autre qui déclenche une mise à jour, vous pourriez être dans une situation lors de l'incendie sur Insérer. Mon scénario était que je voulais conserver une version de document sur chaque modification. J'ai eu le déclencheur sur INSERT pour définir la version comme 1, d'où effectuant une modification de l'enregistrement, ce qui a également déclenché la gâchette de mise à jour qui définit la version comme 2 car la gâchette insertion a mis à jour l'enregistrement juste inséré. Méfiez-vous de cette situation lorsque le déclencheur d'insertion modifie quelque chose, ce qui entraîne le déclenchement de la mise à jour.


Les déclencheurs ne fonctionnent pas après que l'action soit commise; Ils fonctionnent à l'intérieur de la même transaction immédiatement après que l'action ait eu lieu, donc s'il y a un retour, il sera annulé toutes les mises à jour effectuées par la gâchette.



2
votes

Je pensais que je soulignerais du lien Eric posté une situation dans laquelle un déclencheur ne tiendrait pas:

Bien qu'une instruction TABLE tronquée soit en vigueur, elle ne peut pas activer une gâchette car l'opération ne connecte pas les suppressions de ligne individuelles. Cependant, seuls ceux qui portant des autorisations sur une table pour exécuter une table tronquée doivent être préoccupés par inadvertance de contourner un déclencheur de suppression avec une déclaration de table tronquée.


0 commentaires

5
votes

On 2008, vous pouvez utiliser modifier la capture de données

Il y a aussi quelques situations lorsque des déclencheurs ne tirent pas, tels que:

· Une table est tombée.

· Une table est tronquée.

· Les paramètres des déclencheurs imbriqués et / ou récursifs empêchent un déclencheur de la cuisson.

· Les données sont en vrac chargées et contournent des déclencheurs.


0 commentaires

3
votes

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

Toute déclaration de type d'action se déclenche que le déclencheur 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 / suppressions.

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, changement de logique basé sur un ensemble. Un curseur dans un déclencheur peut apporter votre application entière arrété alors qu'une transaction de 500.000 processus de dossiers et verrouille la table pendant des heures.

inserts en vrac par les déclencheurs de passe à moins que vous spécifiez pour les utiliser. Soyez conscient de cela parce que si vous les laissez en passer le déclencheur, 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.


0 commentaires