# TD7 — Intégration des BD dans les Applications
A. Préparation SQL minimale (côté BD)
Objectif : préparer les objets que l’application appellera.
Exercice A1 – Vérification du schéma
Depuis psql :
- Vérifier l’existence de
client,village,sejour,ArchiveSejour. - Vérifier les contraintes posées dans les blocs 2 et 3 (NOT NULL, CHECK, PK/FK, exclusion des chevauchements…).
- Expliquer en 5 lignes comment ces contraintes impactent l’application (retours d’erreur, SQLSTATE, rollback).
Exercice A2 – Préparer l’API SQL minimale
Écrire (ou vérifier) :
inscrire_client(nom, age)ville_offre(ville)(simple SELECT)disponibilite(ville, debut, fin)(version simple, sans capacité)reserver(idc, ville, debut, fin)(stub : juste un RAISE NOTICE)
C’est cette API que les programmes appelleront.
B. Appels programmés – primitives techniques
Objectif : apprendre à appeler proprement des requêtes depuis un langage.
Exercice B1 – Connexion simple
Écrire un programme minimal qui :
- ouvre une connexion (JDBC / PDO / psycopg) ;
- exécute
SELECT 1; - affiche le résultat ;
- gère proprement les erreurs de connexion.
Exercice B2 – Requête paramétrée
Écrire un programme qui prend en entrée un nom de client et affiche :
idc | nom | age
via une requête paramétrée :
SELECT idc, nom, age FROM client WHERE nom = ?
Exercice B3 – INSERT + RETURNING
Depuis un programme, appeler :
INSERT INTO client(nom, age) VALUES (?, ?) RETURNING idc;
Afficher l’idc retourné.
Exercice B4 – Appel de fonction SQL
Écrire un programme qui appelle une fonction simple (ex. compter_clients()) et affiche le résultat.
Variante : lire un RECORD (résultat à plusieurs colonnes).
Exercice B5 – Appel de procédure SQL
Depuis un langage :
CALL inscrire_client(?, ?);
Afficher les messages/erreurs reçus (NOTICE, EXCEPTION).
Exercice B6 – Transactions
Écrire un programme qui :
- commence une transaction ;
- insère deux clients ;
- déclenche volontairement une erreur UNIQUE ;
- montre que tout est annulé.
C. Cas métier complets (fonctionnalités 1→5 & 6→11)
On utilise maintenant le cahier des charges comme base des enchaînements applicatifs.
Exercice C1 – Inscription client (fonctionnalité 1)
Depuis un programme :
- demander nom + âge ;
- appeler
inscrire_client; - afficher l’idc attribué.
Exercice C2 – Consulter l’offre d’une ville (fonctionnalité 2)
Programme :
- demande une ville ;
- exécute
SELECT idv, ville, activite, prix FROM village WHERE ville = ?; - affiche ligne par ligne.
Exercice C3 – Disponibilités (fonctionnalité 3)
Programme :
- demander ville + dates ;
- appeler la fonction
disponibilite(ville, debut, fin); - afficher les villages retournés.
Exercice C4 – Réservation simple (fonctionnalité 4)
Programme qui :
- prend
idc,ville,debut,fin; - sélectionne le village le plus cher dans cette ville ;
- insère un séjour ;
- retourne
{ids, idv, activite}.
Cas test obligatoires :
- aucune offre → gérer proprement l’erreur ;
- capacité saturée → récupérer le SQLSTATE approprié ;
- chevauchement → erreur via contrainte EXCLUDE.
Exercice C5 – Consulter ses séjours (fonctionnalité 5)
Programme :
SELECT ids, idv, ville, activite, debut, fin
FROM ...
WHERE idc = ?
ORDER BY debut desc
Afficher proprement.
Exercice C6 – Créer un village (fonctionnalité 6)
Écrire un petit outil développeur :
- saisie ville/activité/prix/capacité ;
- insertion ;
- affichage de l’idv.
Exercice C7 – Modifier un village (fonctionnalité 7)
Programme qui :
- charge les infos du village (lecture) ;
- applique une mise à jour légale (seuls champs autorisés) ;
- affiche l’état final.
Exercice C8 – Consulter les séjours filtrés (fonctionnalité 8)
Programme paramétrable : ville | période | client. Requêtes avec filtres optionnels (construction dynamique).
Exercice C9 – Purge des séjours (fonctionnalité 9)
Programme appelant :
CALL purge_sejours(:date);
Afficher le nombre supprimé.
Exercice C10 – Annulation administrative (fonctionnalité 10)
Programme qui :
- appelle
annuler_sejour(ids, motif); - puis vérifie en SELECT qu’une ligne est apparue dans
ArchiveSejour.
Exercice C11 – Archivage automatique (fonctionnalité 11)
Test programmatique de votre trigger :
- supprimer un séjour ;
- vérifier l’insertion dans ArchiveSejour.
D. Tests d’erreurs – SQLSTATE et rollback
Objectif : apprendre à manipuler les erreurs réelles du SGBD.
Exercice D1 – Violation UNIQUE
Tenter deux insertions identiques depuis un programme → capturer SQLSTATE = 23505.
Exercice D2 – Violation CHECK
Forcer un age < 0 → tester le rattrapage.
Exercice D3 – Violation FK
Supprimer un client utilisé dans sejour → analyser le comportement (CASCADE vs RESTRICT).
Exercice D4 – Violation exclusion (chevauchement)
Provoquer deux séjours qui se chevauchent pour le même client → SQLSTATE extrait dans l’application.
Exercice D5 – Appel de procédure qui lève EXCEPTION
Tester une procédure volontairement fautive :
RAISE EXCEPTION USING ERRCODE = 'P0001';
Afficher code + message.
E. Intégration applicative finale – pipeline complet
Travail synthèse. Tout doit tourner depuis un programme (Java/PHP/Python), pas dans psql.
Exercice E1 – Scénario “client complet”
Votre programme effectue :
- inscription ;
- consultation offre ;
- disponibilités ;
- réservation ;
- consultation des séjours ;
- suppression du séjour ;
- vérification archivage.
Exercice E2 – Scénario “employé complet”
- création d’un village ;
- modification ;
- création d’un second ;
- purge ;
- tentative d’annulation ;
- vérification des vues et droits (TD6).
Exercice E3 – Programme de test automatique
Créer un script/programme exécutant une batterie de tests :
- 10 insertions / 10 suppressions ;
- tests de capacité ;
- tests d’annulation ;
- tests d’erreur.
Exercice E4 – Mini-ORM artisanal
Écrire une petite classe/struct Village ou Client avec :
- constructeur depuis ResultSet ;
- méthode
load(id); - méthode
save()(INSERT/UPDATE) ; - méthode
delete(ids).