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)
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;
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Télécharger le fichier suivant :
👉 Télécharger le fichier 'cdi.sql' - Télécharger le MCD
Importer ce fichier dans votre base de données MariaDB pour créer la base bibliotheque
et ses tables.
Étape 1 : Créer la base de données
Importer le fichier cdi.sql
dans votre environnement MariaDB.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 2 : Créer une table log_emprunts
pour enregistrer les nouveaux emprunts
Créer une table log_emprunts
qui enregistrera les emprunts effectués dans la bibliothèque.
Chaque fois qu’un emprunt est ajouté dans la table emprunts
, un enregistrement sera ajouté dans log_emprunts
.
Structure de la table log_emprunts
:
idlog
: identifiant auto-incrémentéidlivre
: identifiant du livre empruntéidemprunteur
: identifiant de l’emprunteurdate_emprunt
: date de l’emprunt (prise depuisdatepret
)horodatage
: date et heure de l’enregistrement dans le log (NOW())
Une solution
Vous devez être connecté pour voir le contenu.
Étape 3 : Créer un déclencheur AFTER INSERT
sur la table emprunts
Créer un déclencheur appelé log_nouvel_emprunt
qui s’exécute après chaque insertion dans la table emprunts
.
Ce déclencheur doit insérer dans la table log_emprunts
les informations suivantes :
idlivre
:NEW.idlivre
idemprunteur
:NEW.idemprunteur
date_emprunt
:NEW.datepret
horodatage
:NOW()
Une solution
Vous devez être connecté pour voir le contenu.
Étape 4 : Tester le déclencheur en insérant un nouvel emprunt
Ajouter un nouvel emprunt dans la table emprunts
.
Vérifier ensuite que la table log_emprunts
contient bien une ligne correspondante.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 5 : Créer une table log_modifications_auteur
pour tracer les modifications d’auteurs
Créer une table qui permettra de conserver une trace des anciennes valeurs lorsqu’un auteur est modifié.
Structure de la table :
idlog
: identifiant auto-incrémentéidauteur
: identifiant de l’auteur modifiéancien_nom
: ancienne valeur du nomancien_prenom
: ancienne valeur du prénomhorodatage
: date et heure de la modification
Une solution
Vous devez être connecté pour voir le contenu.
Étape 6 : Créer un déclencheur BEFORE UPDATE
sur la table auteurs
Créer un déclencheur log_modif_auteur
qui s’exécute avant chaque modification dans la table auteurs
.
Ce déclencheur doit insérer dans log_modifications_auteur
:
idauteur
:OLD.idauteur
ancien_nom
:OLD.nom
ancien_prenom
:OLD.prenom
horodatage
:NOW()
Une solution
Vous devez être connecté pour voir le contenu.
Étape 7 : Tester le déclencheur en modifiant un auteur
Modifier le nom ou le prénom d’un auteur existant.
Vérifier ensuite que la table log_modifications_auteur
contient bien une trace de l’ancienne version.
Une solution
Vous devez être connecté pour voir le contenu.
Étape 8 : Créer une table log_prix_supprimes
pour tracer les livres supprimés
Créer une table log_prix_supprimes
pour stocker les informations des livres supprimés, notamment leur prix.
Structure de la table :
idlog
: identifiant auto-incrémentéidlivre
: identifiant du livre supprimétitre
: titre du livreprix
: prix du livrehorodatage
: date et heure de la suppression
Une solution
Vous devez être connecté pour voir le contenu.
Étape 9 : Créer un déclencheur AFTER DELETE
sur la table livres
Créer un déclencheur log_suppression_livre
qui s’exécute après chaque suppression dans la table livres
.
Ce déclencheur doit insérer dans log_prix_supprimes
:
idlivre
:OLD.idlivre
titre
:OLD.titre
prix
:OLD.prix
horodatage
:NOW()
Une solution
Vous devez être connecté pour voir le contenu.
Étape 10 : Tester le déclencheur en supprimant un livre
Supprimer un livre existant dans la table livres
.
Vérifier que les informations du livre supprimé ont bien été enregistrées dans log_prix_supprimes
:
-- Suppression d’un livre
DELETE FROM livres WHERE idlivre = 2;
-- Vérification du log
SELECT * FROM log_prix_supprimes ORDER BY idlog DESC LIMIT 1;
Résultat attendu : une ligne contenant les informations du livre supprimé (ex. : Le Cid, 6.99 €).