© Éditions Eyrolles
265
chapitre n° 7
Programmation avancée
L’exécution est, pour l’heure, dépendante du nombre de lignes touchées par l’événement.
Seuls les déclencheurs de lignes (row trigger) sont permis, car la directive FOR EACH ROW
est obligatoire. Ils sont pratiques quand on désire utiliser autant de fois le déclencheur qu’il y
a de lignes concernées par une mise à jour.
Si on désirait exécuter une seule fois le déclencheur, quel que soit le nombre de lignes
concernées, il faudrait employer un déclencheur d’état (statement trigger) qui n’est pas encore
reconnu. Pour ce faire, il faudrait ne pas indiquer la directive FOR EACH ROW, ou préciser FOR
EACH STATEMENT à la place (à confirmer avec une prochaine version incluant cette
extension).
Dans l’exemple d’une table t1 ayant cinq enregistrements, si on programme un déclencheur de
niveau ligne avec l’événement AFTER DELETE, et qu’on lance DELETE FROM t1, le
déclencheur effectuera cinq fois ses instructions (une fois après chaque suppression). Le
tableau suivant explique ce mécanisme :
Seuls les déclencheurs de lignes peuvent accéder aux anciennes et aux nouvelles valeurs des
colonnes de la ligne affectée par la mise à jour prévue par l’événement. Les identificateurs OLD
et NEW sont programmés pour cela. Ce sont des extensions de MySQL à la norme SQL
(MySQL suit ainsi Oracle dans ce domaine qui propose :OLD et :NEW).
Un déclencheur de type AFTER ne se lance sur une table t que si le déclencheur de type
BEFORE de la table t (s’il existe) et que l’instruction associée à l’événement se sont correctement déroulés.
Quand utiliser la directive OLD ?
Chaque enregistrement qui tente d’être supprimé d’une table, qui inclut un déclencheur de
type DELETE FOR EACH ROW, est désigné par OLD au niveau du code du déclencheur.
L’accès aux colonnes de ce pseudo-enregistrement dans le corps du déclencheur se fait par la
notation pointée.
Considérons l’exemple suivant, et programmons la règle de gestion tout pilote qui perd une
qualification doit voir son compteur automatiquement décrémenter. Programmons le déclencheur TrigDelQualif qui surveille les suppressions de la table Qualifications, et diminue de un la colonne nbQualif pour le pilote concerné par la suppression de sa qualification.
Tableau 7-17 Exécution d’un déclencheur LMD
Nature de
l’événement
État (statement trigger)
sans FOR EACH ROW
Ligne (row trigger)
avec FOR EACH ROW
BEFORE
Exécution une fois avant la mise à jour.
Exécution avant chaque ligne mise à jour.
AFTER
Exécution une fois après la mise à jour.
Exécution après chaque ligne mise à jour.
265
chapitre n° 7
Programmation avancée
L’exécution est, pour l’heure, dépendante du nombre de lignes touchées par l’événement.
Seuls les déclencheurs de lignes (row trigger) sont permis, car la directive FOR EACH ROW
est obligatoire. Ils sont pratiques quand on désire utiliser autant de fois le déclencheur qu’il y
a de lignes concernées par une mise à jour.
Si on désirait exécuter une seule fois le déclencheur, quel que soit le nombre de lignes
concernées, il faudrait employer un déclencheur d’état (statement trigger) qui n’est pas encore
reconnu. Pour ce faire, il faudrait ne pas indiquer la directive FOR EACH ROW, ou préciser FOR
EACH STATEMENT à la place (à confirmer avec une prochaine version incluant cette
extension).
Dans l’exemple d’une table t1 ayant cinq enregistrements, si on programme un déclencheur de
niveau ligne avec l’événement AFTER DELETE, et qu’on lance DELETE FROM t1, le
déclencheur effectuera cinq fois ses instructions (une fois après chaque suppression). Le
tableau suivant explique ce mécanisme :
Seuls les déclencheurs de lignes peuvent accéder aux anciennes et aux nouvelles valeurs des
colonnes de la ligne affectée par la mise à jour prévue par l’événement. Les identificateurs OLD
et NEW sont programmés pour cela. Ce sont des extensions de MySQL à la norme SQL
(MySQL suit ainsi Oracle dans ce domaine qui propose :OLD et :NEW).
Un déclencheur de type AFTER ne se lance sur une table t que si le déclencheur de type
BEFORE de la table t (s’il existe) et que l’instruction associée à l’événement se sont correctement déroulés.
Quand utiliser la directive OLD ?
Chaque enregistrement qui tente d’être supprimé d’une table, qui inclut un déclencheur de
type DELETE FOR EACH ROW, est désigné par OLD au niveau du code du déclencheur.
L’accès aux colonnes de ce pseudo-enregistrement dans le corps du déclencheur se fait par la
notation pointée.
Considérons l’exemple suivant, et programmons la règle de gestion tout pilote qui perd une
qualification doit voir son compteur automatiquement décrémenter. Programmons le déclencheur TrigDelQualif qui surveille les suppressions de la table Qualifications, et diminue de un la colonne nbQualif pour le pilote concerné par la suppression de sa qualification.
Tableau 7-17 Exécution d’un déclencheur LMD
Nature de
l’événement
État (statement trigger)
sans FOR EACH ROW
Ligne (row trigger)
avec FOR EACH ROW
BEFORE
Exécution une fois avant la mise à jour.
Exécution avant chaque ligne mise à jour.
AFTER
Exécution une fois après la mise à jour.
Exécution après chaque ligne mise à jour.
