Dans SQL Server, vous pouvez utiliser le CREATE TRIGGER
déclaration pour créer un déclencheur.
Un déclencheur est un type spécial de procédure stockée qui s'exécute automatiquement lorsqu'un événement se produit dans le serveur de base de données.
Vous pouvez créer un déclencheur DML, un déclencheur DDL ou un déclencheur de connexion.
Cet article fournit un exemple de création d'un déclencheur DML.
Qu'est-ce qu'un déclencheur DML ?
Un déclencheur DML est un déclencheur qui s'exécute lorsqu'un utilisateur tente de modifier des données via un événement de langage de manipulation de données (DML).
Les événements DML incluent INSERT
, UPDATE
, ou DELETE
déclarations. Les déclencheurs DML peuvent être utilisés pour appliquer les règles métier et l'intégrité des données, interroger d'autres tables et inclure des instructions T-SQL complexes.
Le déclencheur et l'instruction qui le déclenche sont traités comme une seule transaction, qui peut être annulée depuis le déclencheur.
Exemple
Voici un exemple pour illustrer le fonctionnement des déclencheurs DML.
CREATE TABLE t1 (
id int IDENTITY(1,1) NOT NULL,
c1 int DEFAULT 0,
c2 int DEFAULT 0,
c3 int DEFAULT 0
);
CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);
Dans cet exemple, je crée une table et je crée également un déclencheur qui sera déclenché chaque fois qu'une ligne est insérée ou mise à jour dans cette table.
Dans ce cas, le déclencheur ajoute 1 au c3
chaque fois que des données sont insérées ou mises à jour.
J'ai appelé le déclencheur trg_t1
. J'ai suivi cette partie avec ON t1
, ce qui signifie que le déclencheur sera exécuté sur la table appelée t1
.
Vous pouvez également spécifier une vue sur laquelle le déclencheur doit s'exécuter, bien que vous ne puissiez référencer une vue que par un INSTEAD OF
déclencheur (dans ce cas, remplacez AFTER
avec INSTEAD OF
). De plus, vous ne pouvez pas définir de déclencheurs DML sur des tables temporaires locales ou globales.
AFTER
spécifie que le déclencheur DML ne se déclenche que lorsque toutes les opérations spécifiées dans l'instruction SQL de déclenchement ont été lancées avec succès. Vous pouvez également spécifier FOR
ici.
Une autre alternative consiste à utiliser INSTEAD OF
, qui exécutera le déclencheur à la place de l'instruction SQL de déclenchement. Cela remplace donc les actions des instructions de déclenchement.
Quel est le inserted
Tableau ?
Dans mon déclencheur, je peux savoir quelle ligne a été mise à jour en interrogeant le inserted
tableau.
SQL Server crée et gère une table appelée inserted
, qui est une table temporaire résidente en mémoire qui stocke des copies des lignes affectées pendant INSERT
et UPDATE
déclarations. Lors d'une transaction d'insertion ou de mise à jour, de nouvelles lignes sont ajoutées à la fois au inserted
table et la table de déclenchement. Les lignes de la table insérée sont des copies des nouvelles lignes de la table de déclenchement.
SQL Server crée et gère également une table similaire appelée supprimée, qui stocke des copies des lignes affectées pendant DELETE
et UPDATE
déclarations. Lors de l'exécution d'un DELETE
ou UPDATE
, les lignes sont supprimées de la table de déclenchement et transférées vers la table supprimée.
Exécutez le déclencheur
Maintenant que la table et son déclencheur ont été créés, exécutons quelques instructions SQL qui la déclencheront.
INSERT INTO t1 (c1)
VALUES (1);
SELECT * FROM t1;
Résultat :
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 1 | 0 | 1 | +------+------+------+------+
Nous pouvons donc voir que le déclencheur a fonctionné comme prévu. Lorsque j'ai inséré une ligne, je n'ai spécifié qu'une valeur pour le c1
colonne, mais le déclencheur s'est assuré que le c3
colonne a également été mise à jour.
Notez que la valeur par défaut pour toutes les colonnes est 0
(comme spécifié lors de la création de la table), et le déclencheur a ajouté 1 à cela.
Effectuons une UPDATE
opération sur la même colonne.
UPDATE t1
SET c1 = c1 + 1
WHERE id = 1;
SELECT * FROM t1;
Résultat :
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 0 | 2 | +------+------+------+------+
Encore une fois, le c3
la colonne a également été mise à jour par le déclencheur.
Maintenant, mettons à jour le c2
colonne.
UPDATE t1
SET c2 = c2 + 1
WHERE id = 1;
SELECT * FROM t1;
Résultat :
+------+------+------+------+ | id | c1 | c2 | c3 | |------+------+------+------| | 1 | 2 | 1 | 3 | +------+------+------+------+
Donc encore une fois, le c3
la colonne est mise à jour par le déclencheur.
Ce déclencheur particulier est déclenché chaque fois qu'une autre colonne de la même ligne est mise à jour.
Vous pouvez également utiliser IF UPDATE(column_name)
pour vérifier une mise à jour d'une seule colonne, ou COLUMNS_UPDATED()
pour vérifier les mises à jour sur plusieurs colonnes.