5.11. Gestion des dépendances
Lorsque des structures de base complexes sont créés qui impliquent
beaucoup de tables avec des contraintes de clés étrangères, des vues,
des déclencheurs, des fonctions, etc., un réseau de dépendances entre
les objets est implicitement créé. Par exemple, une table avec une
contrainte de clé étrangère dépend de la table à laquelle elle fait
référence.
Pour garantir l'intégrité de la structure entière de la base,
PostgreSQL™ s'assure qu'un
objet dont d'autres objets dépendent ne peut pas être supprimé.
Ainsi, toute tentative de suppression de la table des produits
utilisée dans la Section 5.3.5, « Clés
étrangères », sachant que la table des commandes en dépend,
lève un message d'erreur comme celui-ci :
DROP TABLE produits;
NOTICE: constraint commandes_no_produit_fkey on table commandes depends on table
produits
ERROR: cannot drop table produits because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.
ou en français :
DROP TABLE produits;
NOTICE: la contrainte commandes_no_produit_fkey sur la table commandes dépend
de la table produits
ERREUR: la table produits ne peut pas être supprimée, car d'autre objets en
dépendent
HINT: Utiliser DROP ... CASCADE pour supprimer également les objets
dépendants.
Le message d'erreur contient un indice utile : pour ne pas avoir à
supprimer individuellement chaque objet dépendant, on peut lancer
DROP TABLE produits CASCADE;
et tous les objets dépendants seront ainsi effacés. Dans ce cas, cela
n'efface pas la table des commandes mais seulement la contrainte de
clé étrangère. (pour vérifier ce que
DROP ... CASCADE
fait, lancer
DROP
sans CASCADE et lire les messages NOTICE).
Toutes les commandes de suppression dans PostgreSQL™ supportent l'utilisation de
CASCADE. La nature des dépendances est
évidemment fonction de la nature des objets. On peut aussi écrire
RESTRICT au lieu de CASCADE pour obtenir le comportement par défaut, à
savoir interdire les suppressions d'objets dont dépendent d'autres
objets.
Note
D'après le standard SQL, il est nécessaire d'indiquer RESTRICT ou CASCADE.
Aucun système de base de donnée ne force cette règle, en réalité,
mais le choix du comportement par défaut, RESTRICT ou CASCADE,
varie suivant le système.
Note
Les dépendances de contraintes de clés étrangères et de colonnes
serial
des versions de PostgreSQL™ antérieures à 7.3 ne sont
pas
maintenues ou créées
pendant le processus de mise à jour. Tout autre type de
dépendance est proprement créé pendant une mise à jour à partir
d'une base de données antérieure à la 7.3.