Bloc 5 — TD/TP : Triggers et contrôles automatiques
Objectifs pédagogiques
- Implémenter la logique métier du cahier des charges par triggers.
- Garantir la cohérence des données sans intervention applicative.
- Utiliser
RAISE NOTICEetRAISE EXCEPTIONpour la traçabilité et la validation.
Partie A — Sur feuille : conception et analyse
Identifier les événements à automatiser. D’après le cahier des charges, lister pour chaque table les actions susceptibles de déclencher un traitement automatique (insertion, mise à jour, suppression).
Tracer la chaîne d’actions. Schématisez la propagation : suppression → archivage → vérification de contrainte → journalisation. Indiquez le moment d’exécution adéquat (
BEFORE/AFTER).Déterminer les erreurs à lever. Énumérez les cas où une erreur doit interrompre la transaction :
- chevauchement détecté malgré exclusion,
- séjour au-delà de l’année,
- suppression d’un village encore réservé, etc.
Partie B — Sur machine : implémentation
Exercice 1 — Archivage automatique
Objectif : implémenter la fonctionnalité 11.
Vérifier : suppression d’un séjour → ligne ajoutée dans ArchiveSejour.
Exercice 2 — Contrôle de cohérence avant insertion
Objectif : refuser toute réservation au-delà de l’année courante.
Tester : insertion valide / invalide → exception bloquante.
Exercice 3 — Refus de suppression d’un village réservé
Objectif : fonctionnalité implicite (capacité et intégrité logique).
Exercice 4 — Mise à jour automatique des totaux
Ajouter une colonne nb_sejours int dans client.
Créer un trigger AFTER INSERT OR DELETE ON sejour qui met à jour client.nb_sejours.
But : préparer le reporting global sans requête d’agrégat.
Exercice 5 — Gestion des erreurs et messages
Modifier les fonctions précédentes pour :
- utiliser
RAISE NOTICE,RAISE WARNING,RAISE EXCEPTION USING MESSAGE = …, ERRCODE = 'P0001'; - tester la remontée d’erreur dans
psqlet son effet sur la transaction.
Partie C — Application intégrée
Scénario complet
- Un client crée un séjour valide.
- L’employé exécute la purge/archivage.
- L’employé tente ensuite de supprimer un village occupé (échec).
- Le client essaie un séjour multi-année (échec).
- Vérifier les traces (
NOTICE) et les exceptions (EXCEPTION).
Extension libre
- Créer un journal
log_evenementalimenté par un triggerAFTER INSERT OR DELETE ON sejour. Colonnes :evenement text,horodatage timestamptz default now(). - Visualiser les logs des trois dernières opérations.
- Créer un journal
Partie D — Pour aller plus loin / devoir maison
- Regrouper les triggers d’archivage et de vérification dans un même schéma logique (
schema systeme). - Expérimenter un trigger INSTEAD OF sur une vue de synthèse (
vue_sejours_actifs). - Comparer : logique en trigger vs logique en procédure ; discuter des avantages.