CCTL 3 – Programmation SQL :
Déclencheurs & Trigger Functions
Compétences visées : les déclencheurs (C1) ; la trigger function (C2). CCTL du 10 juillet 2026.
1. Rappels rapides
Le langage SQL comprend :
LDD (langage de définition de données) : CREATE, ALTER, DROP
LMD (langage de manipulation de données) : INSERT, UPDATE, DELETE, SELECT
Une contrainte est une règle qui limite le type de données insérables dans une table
(PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK…)
2. Les déclencheurs (triggers)
Un déclencheur (trigger) est un bloc de code associé à une table (ou une vue), qui s'exécute
automatiquement en réaction à un évènement de modification des données survenant sur cette
table.
À quoi ça sert :
automatiser des actions (calculer ou mettre à jour une valeur dérivée)
maintenir l'intégrité et la cohérence des données au-delà de ce que les contraintes
classiques permettent
historiser ou journaliser des opérations (table d'audit)
interdire certaines opérations selon des règles métier complexes
Caractéristiques d'un trigger :
Caractéristique Valeurs possibles
Moment de déclenchement BEFORE (avant l'opération) · AFTER (après
l'opération) · INSTEAD OF (sur une vue)
Évènement déclencheur INSERT · UPDATE · DELETE (TRUNCATE selon
le SGBD)
Portée FOR EACH ROW (une fois par ligne affectée) ·
FOR EACH STATEMENT (une seule fois pour
toute la requête)
3. La trigger function (fonction déclencheur)
Sous PostgreSQL (et d'autres SGBD avancés), la logique d'un trigger n'est pas écrite directement
dans l'instruction qui le crée : elle est encapsulée dans une fonction dédiée, la trigger function,
que l'on associe ensuite à une table.
Étapes de création :
1. Créer la trigger function avec CREATE FUNCTION … RETURNS TRIGGER AS $$ … $$
LANGUAGE plpgsql;
2. Lier cette fonction à une table avec CREATE TRIGGER … EXECUTE FUNCTION nom_fonction();
Particularités d'une trigger function :
elle ne prend aucun argument en entrée
elle retourne le type spécial TRIGGER
elle accède aux enregistrements concernés via deux pseudo-variables : NEW (le nouvel
enregistrement, disponible pour INSERT et UPDATE) et OLD (l'ancien enregistrement,
disponible pour UPDATE et DELETE)
elle doit se terminer par un RETURN : RETURN NEW; pour laisser passer l'opération (utile en
BEFORE), RETURN OLD; (souvent en DELETE), ou RETURN NULL; pour annuler l'opération (en
BEFORE)
la variable spéciale TG_OP contient le type d'opération en cours ('INSERT', 'UPDATE',
'DELETE')
4. Syntaxe générale
-- 1. Créer la trigger function
CREATE FUNCTION nom_fonction()
RETURNS TRIGGER AS $$
BEGIN
-- logique métier
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 2. Créer le trigger et le lier à la fonction
CREATE TRIGGER nom_trigger
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON nom_table
FOR EACH {ROW | STATEMENT}
EXECUTE FUNCTION nom_fonction();
5. Exemples pratiques (tables Bachelier, Etablissement, Filière, Postuler)
Exemple 1 — Contrôler une valeur avant insertion (BEFORE INSERT)
CREATE FUNCTION verifier_moyenne()
RETURNS TRIGGER AS $$
BEGIN
IF [Link] < 0 OR [Link] > 20 THEN
RAISE EXCEPTION 'La moyenne doit être comprise entre 0 et 20';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_verifier_moyenne
BEFORE INSERT OR UPDATE ON Bachelier
FOR EACH ROW
EXECUTE FUNCTION verifier_moyenne();
Exemple 2 — Journaliser une suppression (AFTER DELETE)
CREATE TABLE Bachelier_archive (
numBach INT,
nom VARCHAR(20),
date_suppression TIMESTAMP DEFAULT NOW()
);
CREATE FUNCTION archiver_bachelier()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO Bachelier_archive(numBach, nom)
VALUES ([Link], [Link]);
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_archiver_bachelier
AFTER DELETE ON Bachelier
FOR EACH ROW
EXECUTE FUNCTION archiver_bachelier();
Exemple 3 — Mettre à jour un attribut automatiquement (BEFORE UPDATE)
CREATE FUNCTION maj_date_modif()
RETURNS TRIGGER AS $$
BEGIN
NEW.date_modification := NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_maj_date_modif
BEFORE UPDATE ON Bachelier
FOR EACH ROW
EXECUTE FUNCTION maj_date_modif();
6. Supprimer un trigger / une trigger function
DROP TRIGGER nom_trigger ON nom_table;
DROP FUNCTION nom_fonction();
7. Bonnes pratiques
documenter le rôle de chaque trigger (nom explicite)
éviter les triggers en cascade non maîtrisés (risque de boucle infinie)
préférer BEFORE pour valider ou modifier une donnée avant son enregistrement, AFTER
pour déclencher une action externe (journalisation, notification)
un trigger reste invisible dans le code applicatif : à utiliser avec parcimonie et à bien tester