TD6 — Indépendance des niveaux, vues et confidentialité
Objectifs d’apprentissage
- Comprendre la séparation externe / logique / physique dans un SGBD.
- Concevoir des vues stables masquant la structure interne.
- Gérer la confidentialité via droits et procédures encapsulées.
- Utiliser le catalogue système pour explorer la métabase.
Partie A — Sur feuille
Architecture à trois niveaux
- Dessinez les trois niveaux (externe, logique, physique) de votre application.
- Indiquez pour chaque niveau les objets concrets : externe → vues, fonctions ; logique → tables métier ; physique → fichiers, index, catalogue.
- Citez un exemple de dépendance à éviter entre deux niveaux.
Vues et indépendance
- Expliquez en une phrase la différence entre vue logique et vue matérialisée.
- Citez deux avantages d’utiliser une vue dans le contexte du projet “séjours”.
Catalogue système
- Quelle est la différence entre
pg_catalogetinformation_schema? - Donnez un exemple de requête pour lister toutes les vues du schéma
public.
- Quelle est la différence entre
Partie B — Sur machine : Vues et niveaux d’accès
Exercice 1 — Vue de synthèse client
Créer une vue vue_sejours_client affichant :
idc, nom, ids, ville, activite, debut, fin
en joignant client, sejour, village.
Exercice 2 — Vue de service limitée
Créer une vue vue_offre_publique(ville, activite, prix) excluant les colonnes internes (idv, capacite).
Tester qu’un utilisateur sans droits directs sur village peut lire la vue si vous :
REVOKE SELECT ON village FROM public;
GRANT SELECT ON vue_offre_publique TO public;
Exercice 3 — Vue matérialisée
Créer une vue matérialisée vue_prix_moyen donnant, par ville, le prix moyen des villages.
Mettre à jour la vue après modification d’un prix :
REFRESH MATERIALIZED VIEW vue_prix_moyen;
Exercice 4 — Vue dépendante d’une procédure
Créer une procédure creer_village_confidentiel(p_ville text, p_activite text, p_prix numeric, p_capacite int) déclarée SECURITY DEFINER.
– Elle insère un nouveau village.
– Elle logge l’action avec RAISE NOTICE.
– Donnez à un rôle employe uniquement le droit EXECUTE sur cette procédure.
Vérifiez qu’il ne peut pas insérer directement dans village.
Exercice 5 — Audit du dictionnaire
Écrivez une requête listant les vues et leur définition à partir de pg_catalog.pg_views.
Ajoutez une fonction liste_vues() renvoyant (schemaname text, viewname text, definition text).
Partie C — Scénario d’intégration
Indépendance externe / logique
- Supprimez une colonne non utilisée de
village(ex.note) et montrez que la vuevue_offre_publiquereste fonctionnelle.
- Supprimez une colonne non utilisée de
Encapsulation et droits
- Un rôle
secretairene doit voir que les clients de Saint-Tropez : Créez une vuevue_clients_st_tropfiltrantdestination ILIKE 'St Trop%'et ne lui accordez que le droit SELECT dessus.
- Un rôle
Sécurité exécutive
- Vérifiez que
secretairepeut exécuterCALL creer_village_confidentiel(...)sans accès direct aux tables.
- Vérifiez que
Analyse du catalogue
- Listez dans
pg_rolesles rôles existants et leurs privilèges. - Identifiez les vues appartenant à chaque rôle via
pg_views.
- Listez dans
Partie D — Autonomie / Devoir maison
- Créer une vue d’administration
vue_bilan_villages: par ville →nb_villages,nb_sejours,prix_moyen. - Créer une fonction
rafraichir_bilan()qui exécuteREFRESH MATERIALIZED VIEW vue_bilan_villages;. - Créer une procédure
revoke_tout()qui révoque tous les droitsSELECTsur les tables et ne garde que les vues publiques. - Comparer : vue vs procédure vs trigger sur la question de l’indépendance et de la sécurité.
Partie E — Synthèse réflexive (sur feuille)
- Définir en une phrase : indépendance des niveaux, confidentialité, encapsulation.
- Expliquer pourquoi une application bien conçue ne doit jamais accéder directement aux tables métier.
- Donner un exemple d’évolution physique (index, partitionnement) qui ne modifie ni les vues ni les applications clientes.