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
.