Création d'un trigger simple pour mettre à jour les données : AFTER INSERT
Imaginons qu'on a une table où on stocke des infos sur les étudiants. Dans cette table, on veut mettre à jour automatiquement le champ last_modified (date de la dernière modif de la ligne) à chaque fois qu'on ajoute un nouvel étudiant. Ce champ est important pour suivre les changements et gérer les données.
Le scénario est le suivant :
- Quand une nouvelle ligne est ajoutée dans la table, le champ
last_modifiedprend automatiquement la date et l'heure actuelles. - On va utiliser un trigger
AFTER INSERTqui se déclenche après l'insertion réussie des données.
Création de la fonction pour le trigger
D'abord, il faut créer une fonction en PL/pgSQL. Cette fonction va mettre à jour le champ last_modified dans notre table. La fonction est obligatoire pour le trigger, parce que le trigger dit juste "quoi faire", mais c'est la fonction qui fait tout le taf.
Allez, on commence par créer la table :
-- On crée la table students
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
age INT NOT NULL,
last_modified TIMESTAMP
);
Maintenant, on crée la fonction pour mettre à jour le champ last_modified :
-- Fonction pour mettre à jour last_modified
CREATE OR REPLACE FUNCTION update_last_modified()
RETURNS TRIGGER AS $$
BEGIN
-- On met l'heure actuelle dans le champ last_modified
NEW.last_modified := NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Voyons un peu ce que fait cette fonction :
CREATE OR REPLACE FUNCTION update_last_modified()— on crée une fonction qui s'appelleupdate_last_modified. Si elle existe déjà, elle sera remplacée.RETURNS TRIGGER— on précise que la fonction est faite pour être utilisée avec un trigger.NEW.last_modified := NOW();— on met à jour le champlast_modifiedavec la fonctionNOW(), qui renvoie la date et l'heure actuelles.RETURN NEW;— on retourne la ligne modifiée. C'est obligatoire pour un triggerAFTER.
Création du trigger
Après avoir créé la fonction, on peut créer le trigger lui-même et le lier à la table students. Voilà comment faire :
-- On crée le trigger après l'insertion d'une ligne
CREATE TRIGGER set_last_modified
AFTER INSERT ON students
FOR EACH ROW
EXECUTE FUNCTION update_last_modified();
Voilà ce qui se passe ici :
CREATE TRIGGER set_last_modified— on crée un trigger qui s'appelleset_last_modified.AFTER INSERT— le trigger se déclenche après l'insertion réussie d'une ligne dans la table.ON students— le trigger est lié à la tablestudents.FOR EACH ROW— le trigger s'exécute pour chaque nouvelle ligne ajoutée.EXECUTE FUNCTION update_last_modified();— on appelle la fonction qu'on a créée juste avant.
Remarque : le nom du trigger (set_last_modified) et de la fonction (update_last_modified) peut être ce que tu veux, mais c'est mieux de suivre les conventions pour que le code reste clair.
Tester le trigger
Voyons comment marche notre trigger. D'abord, on ajoute quelques lignes dans la table students :
-- On insère des données dans la table
INSERT INTO students (name, age) VALUES ('Ivan Ivanov', 20);
INSERT INTO students (name, age) VALUES ('Anna Petrova', 22);
Maintenant, on regarde ce qu'il y a dans la table :
-- On affiche les données de la table
SELECT * FROM students;
Le résultat attendu pourrait ressembler à ça :
| id | name | age | last_modified |
|---|---|---|---|
| 1 | Otto Min | 20 | 2023-10-10 14:30:45 |
| 2 | Anna Song | 22 | 2023-10-10 14:31:12 |
Tu vois, le champ last_modified s'est rempli tout seul avec la date et l'heure actuelles pour chaque ligne.
Erreurs possibles
- Erreur : "relation does not exist" lors de la création du trigger. Cette erreur arrive si la table
studentsn'existe pas. Vérifie bien que tu as créé la table avant de faire le trigger. - Erreur de droits d'accès. Si l'utilisateur de la base n'a pas les droits pour créer des fonctions ou des triggers, le trigger ne sera pas créé. Vérifie les privilèges de l'utilisateur.
- Oubli de l'appel à la fonction dans le trigger. Si tu oublies de mettre
EXECUTE FUNCTION update_last_modified(), le trigger ne pourra pas faire ce qu'il faut.
Améliorer le trigger : ajouter des conditions
Dans la vraie vie, c'est souvent utile de limiter l'exécution du trigger à certaines conditions. Par exemple, si le champ age est inférieur à 18, on ne veut pas mettre à jour last_modified. On peut faire ça avec la clause WHEN :
-- On crée un trigger avec une condition
CREATE TRIGGER set_last_modified
AFTER INSERT ON students
FOR EACH ROW
WHEN (NEW.age >= 18)
EXECUTE FUNCTION update_last_modified();
Maintenant, le champ last_modified ne sera mis à jour que pour les étudiants dont l'âge est >= 18.
Utilisation pratique
Des triggers comme celui-là sont souvent utilisés dans des projets réels. Voilà quelques exemples :
- Mise à jour automatique de la date de dernière modification (comme on vient de faire).
- Suivi des changements dans la base et écriture de ces changements dans une table de logs.
- Assurer l'intégrité des données, par exemple vérifier les tables liées avant une opération.
- Audit des données pour respecter des règles légales ou d'entreprise.
Ces compétences sont super utiles si tu bosses avec des systèmes où la précision et la fiabilité des données sont importantes, genre dans les banques, la gestion de stock ou les CRM.
GO TO FULL VERSION