Retour au cours

Semaines 7-8 : SGBD et procédures stockées

Sous le capot des systèmes de gestion : transactions, procédures stockées, déclencheurs et performance

Objectifs des semaines 7 et 8

À la fin de ces deux semaines, vous saurez ce qu'un SGBD prend en charge pour vous (persistance, fiabilité, intégrité, concurrence), programmer une transaction qui respecte les propriétés ACID, définir vos tables et leurs contraintes d'intégrité en DDL, créer une vue pour les statistiques, et confier au serveur lui-même la surveillance des données avec une procédure stockée et ses déclencheurs, en pgSQL.

Déroulement

  1. Sous le capot : les services de qualité (persistance, fiabilité, sécurité) et de gestion (fichiers, concurrence, langages) d'un SGBD.
  2. ACID et concurrence : le compte bancaire conjoint, le dîner des philosophes, puis la transaction avec BEGIN, COMMIT et ROLLBACK.
  3. L'intégrité dans la base : le DDL (CREATE, ALTER, DROP), les clés serial, les contraintes NOT NULL, UNIQUE, CHECK et FOREIGN KEY.
  4. Les vues : une requête précalculée qui porte un nom, pour les statistiques sans redondance réelle.
  5. Procédures stockées et déclencheurs : le langage pgSQL, la fonction journaliser() et ses trois déclencheurs. L'atelier du 27 octobre est à présence obligatoire.

Trois squelettes à garder sous la main

Les formes exactes enseignées en classe, prêtes à coller dans pgAdmin. Les variables prédéfinies d'un déclencheur : TG_OP (l'opération), NEW (la rangée après) et OLD (la rangée avant).

1La transaction ACID
BEGIN;
UPDATE compte SET solde = solde - 100
WHERE id = 1;
UPDATE compte SET solde = solde + 100
WHERE id = 2;
COMMIT;
-- en cas de problème, ROLLBACK; annule tout
2La vue statistique
CREATE VIEW statistique_troupeau AS
SELECT id_troupeau, COUNT(*) AS nombre_moutons
FROM mouton
GROUP BY id_troupeau;

SELECT * FROM statistique_troupeau;
3La procédure stockée et son déclencheur
CREATE OR REPLACE FUNCTION journaliser()
RETURNS trigger
LANGUAGE 'plpgsql'
AS $$
BEGIN
    IF TG_OP = 'DELETE' THEN
        INSERT INTO journal(operation, moment)
        VALUES('EFFACER', now());
        RETURN OLD;
    END IF;
    INSERT INTO journal(operation, moment)
    VALUES(TG_OP, now());
    RETURN NEW;
END
$$;

CREATE TRIGGER evenementChangementArticle
    BEFORE UPDATE ON public.article
    FOR EACH ROW EXECUTE PROCEDURE public.journaliser();
Les procédures stockées ne remplacent pas les DAO : la logique de l'application reste dans l'application. On les réserve à l'intégrité complexe et à la gestion de la base elle-même : journalisation, sauvegarde, surveillance.

Notes de cours

Les diaporamas des semaines 7 et 8, en version web (diapositives d'origine, exactes) et en PDF :

Le SGBD et ses qualités

Fonctions et envergure d'un SGBD 10 diapositives - persistance, fiabilité, sécurité, concurrence
Propriétés ACID et transactions 17 diapositives - atomicité, consistance, isolation, durabilité
La concurrence 17 diapositives - démonstration et évitement

Intégrité (en 2 volets complémentaires : Architecture Système puis Pratique PostgreSQL)

Volet 1 : Intégrité des données dans nos systèmes 17 diapositives (sélectionnables) - vue d'ensemble architecturale : périmètre interne (DDL, contraintes, triggers) et périmètre externe (UTF-8, sauvegarde pg_dump, migrations Git, checksum, ORM)
Volet 2 : Intégrité dans la base de données 43 diapositives (sélectionnables) - mise en œuvre pratique dans PostgreSQL, pgAdmin 4 et DAO Java : clés, séquences, requêtes préparées, index, déclencheurs, procédures stockées et journal d'audit
Les vues de données 24 diapositives - principe, avantages, coût et accès

Procédures stockées en pgSQL

Référence : le langage pgSQL 18 diapositives - squelettes, opérateurs, conditionnelles, boucles
Atelier : procédures stockées 10 diapositives - la table journal et journaliser() pas à pas
Exercices : procédures stockées 69 diapositives - des fonctions de base aux déclencheurs
La série SQL Semaines 7-8 : 1 diaporama sur les 10 de la série

Voir toute la série SQL

Ressources

Documentation PostgreSQL en français PL/pgSQL CREATE TRIGGER CREATE VIEW

Évaluations en cours

Ces deux semaines nourrissent directement la dernière livraison du Contrat Auteurs (15 %) : une vue SQL pour les statistiques, la journalisation automatique des éditions et des suppressions dans une table secrète par une procédure stockée, et des statistiques quotidiennes. Le Projet Armada (25 %, semaines 4 à 7) se termine en parallèle.

Page du Contrat Auteurs Présentation Contrat Auteurs (version web)