Exercice
Quelle valeur renvoie la dernière instruction de la liste ci-dessous, sous le SGBDR Oracle :
CREATE TABLE t (a integer, b integer);
CREATE TRIGGER trig_t
BEFORE UPDATE
ON t
FOR EACH ROW
BEGIN
:new.b := :old.a;
END;
INSERT INTO t (a, b) VALUES (1, 1);
UPDATE t SET a=a+1, b=b+1;
UPDATE t SET a=a+1, b=b+1;
SELECT sum(b) FROM t;
CREATE TABLE t (a integer, b integer); CREATE TRIGGER trig_t BEFORE UPDATE ON t FOR EACH ROW BEGIN :new.b := :old.a; END; INSERT INTO t (a, b) VALUES (1, 1); UPDATE t SET a=a+1, b=b+1; UPDATE t SET a=a+1, b=b+1; SELECT sum(b) FROM t;
Le trigger signifie que b prend l'ancienne valeur de a à chaque mise à jour de a ou b.
Soit le contenu de la table t :
Après Create : Ø
Après Insert : (1,1) (trigger ne se déclenche pas)
Après Update n°1 : (2,1) (trigger se déclenche et modifie b)
Après Update n°2 : (3,2) (trigger se déclenche et modifie b)
Donc le SELECT renvoie la valeur 2 (la valeur de b, en notant qu'il y a un seul tuple).
La différence entre un trigger BEFORE et AFTER est que dans un trigger BEFORE UPDATE vous avez le droit de modifier les valeurs de mise à jour (à travers les :new), tandis que sur un AFTER UPDATE vous ne pouvez plus (la mise à jour est terminée).
On pourrait plus justement traduire le BEFORE UPDATE par "PENDANT LA MISE A JOUR" et le AFTER UPDATE par "UNE FOIS LA MISE A JOUR TERMINEE".
Donc BEFORE UPDATE ne veut pas dire que le UPDATE se fera après le TRIGGER, mais que le TRIGGER peut redéfinir les valeurs :new de mise à jour.
On notera que c'est la même chose pour un BEFORE INSERT.