Les déclencheurs
Automatiser des actions lors de modifications dans la base de données
Notions théoriques
Un déclencheur (ou trigger) est un mécanisme de la base de données qui permet d'exécuter automatiquement une action lorsqu’un événement spécifique se produit sur une table.
Les événements peuvent être :
INSERT
: lorsqu’une nouvelle ligne est ajoutéeUPDATE
: lorsqu’une ligne existante est modifiéeDELETE
: lorsqu’une ligne est supprimée
Un déclencheur est associé à une table et à un moment :
BEFORE
(avant l’opération)AFTER
(après l’opération)
Utilité des déclencheurs
Les déclencheurs sont utiles pour :
- Mettre à jour automatiquement des champs (date de modification, utilisateur, etc.)
- Enregistrer un historique des modifications
- Vérifier ou corriger des données
- Maintenir la cohérence entre plusieurs tables
Syntaxe générale
CREATE TRIGGER nom_du_declencheur
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON nom_de_la_table
FOR EACH ROW
BEGIN
-- instructions SQL
END;
FOR EACH ROW
indique que le déclencheur s’exécute pour chaque ligne affectée.- Dans le corps du déclencheur, on peut utiliser :
NEW.colonne
pour accéder à la nouvelle valeur (INSERT ou UPDATE)OLD.colonne
pour accéder à l’ancienne valeur (UPDATE ou DELETE)
Signe =
Dans le code d'un trigger, le signe =
est utilisé pour comparer et non pour affecter une valeur.
Exemple
IF (mdpExisteHisto(NEW.mdpActuel,OLD.id) = false) THEN
Le symbole =
est une comparaison et non une affectation.
Explications
- En SQL (et donc dans les triggers MySQL, MariaDB, etc.), l'opérateur
=
est utilisé pour comparer deux valeurs (équivalent à==
dans d'autres langages comme C ou Java). - Pour l'affectation, on utilise généralement
SET variable = valeur;
(voir ligne 4 et 18 dans votre code).
Détail
- Comparaison :
IF (mdpExisteHisto(NEW.mdpActuel,OLD.id) = false)
vérifie si la fonctionmdpExisteHisto
retournefalse
. - Affectation :
SET correct = true;
affecte la valeurtrue
à la variablecorrect
.
Dans notre exemple (extrait du code d'un trigger) le signe =
sert à comparer le résultat de la fonction à false
.
Ce n'est pas une affectation, mais bien une comparaison.
Restrictions
- Il n’est pas possible d’utiliser
COMMIT
ouROLLBACK
dans un déclencheur. - Un déclencheur ne peut pas appeler une procédure contenant une transaction.
- Les déclencheurs ne doivent pas modifier la même table sur laquelle ils sont déclenchés (risque de boucle infinie).
Exemple d’utilisation
- Journaliser automatiquement les suppressions d’utilisateurs dans une table
log_suppressions
. - Mettre à jour un champ
updated_at
à chaque modification d’une ligne.
Exemple pratique
Il est possible de créer un déclencheur qui enregistre automatiquement les suppressions d’utilisateurs dans une table log_suppressions
.
Étapes
- Créer deux tables :
utilisateurs
etlog_suppressions
- Ajouter quelques utilisateurs
- Créer un déclencheur
AFTER DELETE
surutilisateurs
- Supprimer un utilisateur et observer l’effet du déclencheur
Code SQL
-- 1. Table utilisateurs
CREATE TABLE utilisateurs (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100),
email VARCHAR(100)
);
-- 2. Table de logs
CREATE TABLE log_suppressions (
id INT AUTO_INCREMENT PRIMARY KEY,
nom_utilisateur VARCHAR(100),
email_utilisateur VARCHAR(100),
date_suppression DATETIME
);
-- 3. Insertion de données
INSERT INTO utilisateurs (nom, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com');
-- 4. Déclencheur
DELIMITER //
CREATE TRIGGER log_suppression_utilisateur
AFTER DELETE ON utilisateurs
FOR EACH ROW
BEGIN
INSERT INTO log_suppressions (nom_utilisateur, email_utilisateur, date_suppression)
VALUES (OLD.nom, OLD.email, NOW());
END;
//
DELIMITER ;
-- 5. Suppression d’un utilisateur
DELETE FROM utilisateurs WHERE nom = 'Alice';
-- 6. Vérification
SELECT * FROM log_suppressions;