Vous êtes sur la page 1sur 10

5.

Triggers

 5.1 Définition
 5.2 Exemples
5.1 Définition

 Les Triggers ou déclencheurs en français, sont des procédures


attachées directement à un évènement d'une table, par exemple sur
chaque insertion ou chaque suppression d'enregistrement.
 Un Trigger est donc rattaché à une table et à un évènement, mais on
doit aussi indiquer si le code associé sera déclenché avant ou après
l'évènement

 La syntaxe de création d’un trigger est


 CREATE TRIGGER <nomtrigger> <action_time> <event> ON <table>
 L' action_time précise si l'action a lieu avant (BEFORE) ou après
(AFTER) l'évènement.
 L' event c'est l'action sur laquelle on se rattache
: INSERT, DELETE, UPDATE

Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 126


5.1 Définition

 Prenons l’exemple des messages et topics de forum (Grafikart) :


 CREATE TABLE topic (id_topic INT NOT NULL AUTO_INCREMENT,
 description VARCHAR(255),

 message_at DATETIME);

 CREATE TABLE message (id_message INT NOT NULL


AUTO_INCREMENT,
 id_topic INT, msg TEXT,
 created_at DATETIME DEFAULT CURRENT_TIMESTAMP);
 On souhaite qu'à chaque nouveau message (insert into), le
champ message_at du topic soit mis à jour à la date courante.
 NB : Dans le trigger, on accède aux données du nouvel
enregistrement avec le préfixe NEW ; on accède aux données de
l’ancien enregistrement avec le préfixe OLD
Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 127
5.2 Exemples

 Lors d’un INSERT, on peut uniquement accéder aux nouvelles valeurs (NEW)
 Lors d’un UPDATE, on peut accéder aux anciennes et nouvelles valeurs (avec
OLD et NEW)
 Lors d’un DELETE, on peut accéder uniquement aux anciennes valeurs (OLD)

 Exemple 1
 DELIMITER |
 CREATE TRIGGER insMsg BEFORE INSERT ON message
 FOR EACH ROW
 BEGIN
 UPDATE topic SET message_at = NOW() WHERE id_topic = NEW.id_topic;

 END; |
 Le FOR EACH ROW est obligatoire même si dans notre cas nous ne
traitons qu'un seul enregistrement.
Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 128
5.2 Exemples

 Exemple 2 :
 Supposons que nous voulions supprimer un message, alors la date du topic doit
être mise à jour avec :
 Soit la date de l'avant-dernier message s'il existe ;

 Soit null s'il n'existe pas

 CREATE TRIGGER delMsg BEFORE DELETE ON message


 FOR EACH ROW BEGIN
 DECLARE date_topic DATETIME;
 DECLARE date_av_dernier DATETIME;
 DECLARE id_av_dernier INT DEFAULT 0;
 /* on modifie le topic si seulement le message supprime est le dernier */
 SELECT message_at INTO date_topic
 FROM topic
 WHERE id_topic = OLD.id_topic;

Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 129


5.2 Exemples

 IF date_topic <= OLD.created_at THEN


 BEGIN
 /* on recherche l'avant dernier message du meme topic*/
 SELECT created_at, id_topic INTO date_av_dernier, id_av_dernier
 FROM message
 WHERE id_message <> OLD.id_message
 AND id_topic = OLD.id_topic ORDER BY Created_at DESC LIMIT 1;
 /* on met a jour la date dans le topic ou NULL si pas de message anterieur */
 IF id_av_dernier = 0 THEN
 UPDATE topic SET message_at = NULL WHERE id_topic = OLD.id_topic;
 ELSE
 UPDATE topic SET message_at = date_av_dernier WHERE id_topic = OLD.id_topic;
 END IF;
 END;
 END IF;
 END;
 |

Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 130


5.2 Exemples

 Autre solution en plaçant le trigger après la suppression. Dans ce cas le message est déjà
supprimé, on recherche donc la date du dernier message s'il existe

 .id_topic

Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 131


5.2 Exemples

 Utilisation de trigger pour gérer un compteur de messages


 On suppose que la table topic contient le nombre de messages. Pour cela on rajoute un
champ nb_messages initialisé à zéro.
CREATE TABLE topic (id_topic INT NOT NULL AUTO_INCREMENT,
description VARCHAR(255), message_at DATETIME,
nb_messages INT DEFAULT '0');

 On crée un trigger sur l'ajout de message et un autre sur la suppression


 CREATE TRIGGER cnt_add_msg AFTER INSERT ON message FOR EACH ROW
 UPDATE topic SET nb_messages = nb_messages + 1 WHERE id_topic = NEW.id_topic;
END;

 On crée un trigger sur la suppression de message


 CREATE TRIGGER cnt_del_msg AFTER DELETE ON message FOR EACH ROW
UPDATE topic SET nb_messages = nb_messages - 1 WHERE id_topic = OLD.id_topic;
END;

Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 132


5.2 Exemples

 Comportement avec les Auto-increment


 Supposons que lorsque l'on crée un topic, on crée automatiquement un premier message
qui reprend la description du topic
 DELIMITER |
 CREATE TRIGGER instopic AFTER INSERT ON topic FOR EACH ROW
 INSERT INTO message (id_topic, msg) VALUES (NEW.id_topic, NEW.description); |
 Que nous donne le lastInsertId, celui du message ou celui du topic ?
 Réponse : celui du topic
 $pdo->exec("INSERT INTO topic (description) VALUES (\"La vie des bêtes\");");
 echo $pdo->lastInsertId();

 Suppression en cascade
 Lorsque l'on crée une liaison entre deux tables, on a la possiblité de définir
une suppession en cascade.
 Cela signifie que si on supprime un topic, tous ses messages sont supprimés dans la
foulée (sans avoir besoin de trigger).

Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 133


5.2 Exemples

 Le problème c'est que la suppression dans la table mère désactive le trigger DELETE de
la table fille !!! Il faut choisir l'un ou l'autre.

 Quelques commandes utiles


 Voir les triggers en place
 $: SHOW TRIGGERS LIKE '%';

 Avec MySQL Workbench


 On a la possibilité d'éditer un trigger existant.
 Dans l'explorateur d'objets, faire un clic doit sur le nom de la table puis 'alter table', ensuite
sélectionner l'onglet Trigger.
 Le trigger sera automatiquement Droppé s'il existe puis recréé.

Fotsing Talla Bernard, PhD Bases de Données : Aspects Avancés 134

Vous aimerez peut-être aussi