Partie II
Programmation procédurale
276
© Éditions Eyrolles
Exemple
Considérons à nouveau l’exemple précédent et programmons la contrainte que tout pilote ne
peut être qualifié sur plus de trois types d’appareils. Ici, il s’agit d’assurer la cohérence entre
la valeur de la colonne nbQualif de la table Pilote et les enregistrements de la table
Qualifications.
L’événement déclencheur est ici BEFORE INSERT, car il faudra s’assurer de la condition
avant d’autoriser. Le code minimal de ce déclencheur est décrit dans le tableau suivant en
supposant qu’on dispose d’une table de travail : CREATE
TABLE
Trace(col
VARCHAR(80) PRIMARY KEY).
En considérant les données initiales, le test de ce déclencheur est le suivant. On remarque que
le premier INSERT est bien évité (le pilote PL-1 a déjà trois qualifications). Bizarrement
l’ajout du message dans la table Trace n’est pas effectué, car le déclencheur invalide tout son
traitement en cas d’erreur. La seconde insertion, en revanche, est bien effectuée (le pilote PL3 n’a qu’une seule qualification).
Tableau 7-28 Déclencheur avant insertion
Déclencheur
Commentaires
CREATE TRIGGER TrigInsQualif
ON Qualifications
FOR EACH ROW
BEGIN
DECLARE v_compteur TINYINT(1);
DECLARE v_nom VARCHAR(30);
SELECT nbQualif, nom INTO v_compteur, v_nom
FROM Pilote WHERE brevet = NEW.brevet;
IF v_compteur < 3 THEN
UPDATE Pilote
SET nbQualif = nbQualif + 1
WHERE brevet = NEW.brevet;
ELSE
Déclaration de l’événement déclencheur.
Corps du déclencheur.
Test de la condition.
Mise à jour du pilote concerné par
l’ajout de la qualification.
INSERT INTO TRACE VALUES
(CONCAT('Le pilote ',v_nom,
' a déjà 3 qualifications!'));
END IF;
END;
Instruction jamais réalisée !
Erreur volontaire.
Web
BEFORE INSERT
INSERT INTO TRACE VALUES (NULL);
Précédent

- 298/418

Suivant