Différence entre les déclencheurs FOR et AFTER?

120

Quelle est la différence entre FORet les AFTERdéclencheurs?

sqlchild
la source
5
+1: J'ai lu l'article en ligne de la documentation de SQL Server sur les déclencheurs et je me suis retrouvé avec exactement la même question
pfunk
J'ai trouvé cet article utile: dotnettricks.com/learn/sqlserver
Matt

Réponses:

153

Il n'y a pas de différence, ils font la même chose.

CREATE TRIGGER trgTable on dbo.Table FOR INSERT,UPDATE,DELETE

Est le même que

CREATE TRIGGER trgTable on dbo.Table AFTER INSERT,UPDATE,DELETE

Un INSTEAD OFdéclencheur est différent et se déclenche avant et à la place de l'insertion et peut être utilisé sur les vues, afin d'insérer les valeurs appropriées dans les tables sous-jacentes.

Ben
la source
14
J'ai aimé le commentaire sur les insertions dans les vues utilisant des déclencheurs. Information très utile. À votre santé.
Mariusz
Excusez Monsieur @Ben, quel serait le scénario à insérer dans une vue? Merci ^ - ^
Jeancarlo Fontalvo
@JeancarloFontalvo, 1) compatibilité. Les tables sous-jacentes peuvent changer à condition que la vue reste la même. 2) contrôle d'accès, certains utilisateurs peuvent avoir l'autorisation d'écrire dans certaines colonnes uniquement.
Ben
17

@Ben a tout à fait raison.

Voici l'article MSDN Exploration des déclencheurs SQL Server

Un paragraphe de l'article:

Cette syntaxe est également acceptable dans les anciennes versions de SQL Server. Cependant, maintenant qu'il existe deux types de déclencheurs dans SQL Server 2000, je préfère faire référence aux déclencheurs FOR en tant que déclencheurs AFTER. Ainsi, pour le reste de cet article, je ferai référence aux déclencheurs AFTER ou INSTEAD OF.

Comme le déclencheur AFTER que vous avez vu précédemment, ce déclencheur empêche les modifications apportées au champ de nom. Cependant, il implémente cette règle métier différemment de l'exemple précédent. Étant donné que le déclencheur INSTEAD OF se déclenche à la place de l'instruction UPDATE, le déclencheur INSTEAD OF évalue ensuite si le test de règle métier réussit ou non. Si le test de règle métier réussit, pour que la mise à jour se produise, le déclencheur INSTEAD OF doit invoquer à nouveau explicitement l'instruction UPDATE.

Waqas Raja
la source
4

AFTER spécifie que le déclencheur DML est déclenché uniquement lorsque toutes les opérations spécifiées dans l'instruction SQL de déclenchement se sont exécutées avec succès. Toutes les actions en cascade référentielle et les vérifications de contraintes doivent également réussir avant que ce déclencheur ne se déclenche. AFTER est la valeur par défaut lorsque FOR est le seul mot-clé spécifié.

Les déclencheurs AFTER ne peuvent pas être définis sur les vues.

INSTEAD OF Spécifie que le déclencheur DML est exécuté à la place de l'instruction SQL de déclenchement, remplaçant par conséquent les actions des instructions de déclenchement. INSTEAD OF ne peut pas être spécifié pour les déclencheurs DDL ou d'ouverture de session.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql

Nour El-Hoda
la source
1
Cette formulation "AFTER est la valeur par défaut lorsque FOR est le seul mot-clé spécifié." est très déroutant. Ils auraient pu mieux le formuler.
FMFF