« Déclencheur » = bloc PL/pgSQL exécuté automatiquement en réponse à un événement sur une table ou une vue.
Créer un trigger qui prévienne d'une suppression dans la table client :
CREATE OR REPLACE FUNCTION log_suppression_client()
RETURNS trigger AS $$
BEGIN
RAISE NOTICE 'Suppression d''un client.';
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER avant_supp_cli
BEFORE DELETE ON client
FOR EACH ROW
EXECUTE FUNCTION log_suppression_client();
Explication : Ce trigger avant_supp_cli est un trigger "BEFORE DELETE" qui s'exécute avant chaque suppression dans la table client. Il affiche un message de notification dans la console serveur.
Créer un trigger qui agit en cas de baisse du prix :
CREATE OR REPLACE FUNCTION log_baisse_prix()
RETURNS trigger AS $$
BEGIN
IF OLD.prixht IS NOT NULL AND NEW.prixht IS NOT NULL AND OLD.prixht > NEW.prixht THEN
RAISE NOTICE 'Ancien prix : %', OLD.prixht;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER post_maj_prix
AFTER UPDATE ON article
FOR EACH ROW
EXECUTE FUNCTION log_baisse_prix();
Explication : Ce trigger s’exécute après chaque mise à jour de article ; il
vérifie si le prix baisse et affiche un message serveur avec RAISE NOTICE.
CREATE OR REPLACE FUNCTION fonction_trigger()
RETURNS trigger AS $$
BEGIN
-- Corps du trigger
RETURN NEW; -- ou RETURN OLD selon le cas
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER nom_trigger
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | UPDATE | DELETE | TRUNCATE | ... }
ON nom_table
[ FOR EACH ROW ]
EXECUTE FUNCTION fonction_trigger();
BEFORE/AFTER : moment d’exécution.FOR EACH ROW : une fois par ligne modifiée.trigger.| Type de trigger | Moment | Enregistrement accessible | Valeur à retourner | Effet du retour |
|---|---|---|---|---|
INSERT |
BEFORE |
NEW |
RETURN NEW; |
Confirme ou modifie la ligne à insérer. |
INSERT |
AFTER |
NEW |
RETURN NEW; |
Ignoré (l’insertion est déjà faite). |
UPDATE |
BEFORE |
OLD et NEW |
RETURN NEW; |
Applique la version modifiée de la ligne. |
UPDATE |
AFTER |
OLD et NEW |
RETURN NEW; |
Ignoré (l’update est déjà fait). |
DELETE |
BEFORE |
OLD |
RETURN OLD; |
Autorise la suppression de cette ligne. |
DELETE |
AFTER |
OLD |
RETURN OLD; |
Ignoré (la suppression est déjà effectuée). |
| Tout type | BEFORE |
— | RETURN NULL; |
Annule l’opération pour la ligne courante. |
Règle synthétique : les triggers BEFORE utilisent la valeur renvoyée
pour exécuter ou non la modification. Les triggers AFTER ignorent le retour,
mais PostgreSQL exige tout de même qu’une valeur (OLD ou NEW) soit retournée.
EXCEPTION.Objectif : rendre les fonctions robustes et contrôler précisément les erreurs de manipulation de données.
RAISE EXCEPTION.IF NEW.stock < 0 THEN
RAISE EXCEPTION 'Stock négatif interdit (id=%)', NEW.id;
END IF;
SELECT * FROM cliant;
ERROR: relation "cliant" does not exist — faute de nom de table.ERROR: duplicate key value violates unique constraintIdentifier les messages d’erreur permet de diagnostiquer et sécuriser les opérations en base PostgreSQL.
RAISE EXCEPTION : permet de lever une erreur avec un message explicite.
RAISE EXCEPTION 'Message d''erreur (%)', variable;RAISE EXCEPTION USING
MESSAGE = 'Stock insuffisant',
ERRCODE = 'P0001';
Utilité : renforcer la lisibilité et la robustesse des règles métier directement en base PostgreSQL.
RAISE EXCEPTION, la commande DML est annulée.IF OLD.role = 'admin' THEN
RAISE EXCEPTION 'Impossible de supprimer un compte administrateur.';
END IF;
RAISE EXCEPTION).