Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Exécuter un déclencheur uniquement lorsque certaines colonnes sont mises à jour (SQL Server)

SQL Server a le UPDATE() que vous pouvez utiliser dans vos déclencheurs DML pour vérifier si une colonne spécifique a été mise à jour ou non.

Bien que cette fonction n'accepte qu'une seule colonne, rien ne vous empêche d'inclure plusieurs UPDATE() clauses avec AND ou OR pour tester les mises à jour de plusieurs colonnes.

Exemple

Voici le tableau :

CREATE TABLE t1 (
    id int IDENTITY(1,1) NOT NULL,
    c1 int DEFAULT 0,
    c2 int DEFAULT 0,
    c3 int DEFAULT 0,
    c4 int DEFAULT 0
);

Et voici le déclencheur :

CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE(c1) OR UPDATE(c2) )
BEGIN
UPDATE t1
SET c4 = c4 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;

Dans ce cas, le c4 la colonne ne s'incrémentera que si soit le c1 ou c2 les colonnes ont été mises à jour. Cela se produira même si une seule de ces deux colonnes est mise à jour (parce que j'utilise OR par opposition à AND ).

Testons maintenant le déclencheur en insérant des données dans c1 .

INSERT INTO t1 (c1) 
VALUES (1);

SELECT * FROM t1;

Résultat :

+------+------+------+------+------+
| id   | c1   | c2   | c3   | c4   |
|------+------+------+------+------|
| 1    | 1    | 0    | 0    | 1    |
+------+------+------+------+------+

Comme prévu, c4 a également été mis à jour lorsque c1 a été mis à jour.

Ceci s'applique également chaque fois que c2 est mis à jour.

UPDATE t1 
SET c2 = c2 + 1
WHERE id = 1;

SELECT * FROM t1;

Résultat :

+------+------+------+------+------+
| id   | c1   | c2   | c3   | c4   |
|------+------+------+------+------|
| 1    | 1    | 1    | 0    | 2    |
+------+------+------+------+------+

Et bien sûr, cela s'appliquerait également lorsque les deux sont mis à jour.

Cependant, il ne le fera pas s'applique si nous mettons à jour c3 (mais pas c1 ou c2 ).

UPDATE t1 
SET c3 = c3 + 1
WHERE id = 1;

SELECT * FROM t1;

Résultat :

+------+------+------+------+------+
| id   | c1   | c2   | c3   | c4   |
|------+------+------+------+------|
| 1    | 1    | 1    | 1    | 2    |
+------+------+------+------+------+

Exiger que les deux colonnes soient mises à jour

Nous pouvons changer le OR en AND pour spécifier que le c4 la colonne n'est mise à jour que si les deux c1 et c2 sont en cours de mise à jour.

Modifions notre déclencheur pour spécifier ceci :

ALTER TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE(c1) AND UPDATE(c2) )
BEGIN
UPDATE t1
SET c4 = c4 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;

Maintenant, mettez à jour c1 uniquement.

UPDATE t1 
SET c1 = c1 + 1
WHERE id = 1;

SELECT * FROM t1;

Résultat :

+------+------+------+------+------+
| id   | c1   | c2   | c3   | c4   |
|------+------+------+------+------|
| 1    | 2    | 1    | 1    | 2    |
+------+------+------+------+------+

Donc c1 a été mis à jour comme spécifié, mais c4 ne l'était pas.

La même chose se produirait si nous mettions à jour c2 mais pas c1 .

Mais maintenant, mettons à jour les deux c1 et c2 .

UPDATE t1 
SET c1 = c1 + 1, c2 = c2 + 1
WHERE id = 1;

SELECT * FROM t1;

Résultat :

+------+------+------+------+------+
| id   | c1   | c2   | c3   | c4   |
|------+------+------+------+------|
| 1    | 3    | 2    | 1    | 3    |
+------+------+------+------+------+

Comme prévu, cette fois c4 a également été mis à jour.

Échec des mises à jour

Il est important de noter que le UPDATE() fonction indique simplement si un INSERT ou UPDATE tentative a été effectuée sur une colonne spécifiée d'une table ou d'une vue. Il renverra toujours vrai si la tentative a échoué.

La fonction COLUMNS_UPDATED

Une autre façon de vérifier les mises à jour sur plusieurs colonnes consiste à utiliser le COLUMNS_UPDATED fonction.

Cette fonction renvoie un varbinary modèle binaire indiquant les colonnes insérées ou mises à jour d'une table ou d'une vue.

Pour plus d'informations, consultez la documentation Microsoft pour COLUMNS_UPDATED .