5.10. Gestion des Dépendances

Lorsque vous créez des structures de base complexes impliquant beaucoup de tables avec des contraintes de clés étrangères, des vues, des triggers, des fonctions, etc, vous créez implicitement un filet de dépendances entre les objets. Par exemple, une table avec une contrainte de clé étrangère dépend de la base à laquelle elle fait référence.

Pour garantir l'intégrité de la structure entière de la base, PostgreSQL vérifie que vous ne pouvez pas effacer des objets dont d'autres objets dont dépendants. Par exemple, la tentative d'effacer la table des produits que nous avons utilisé dans Section 5.4.5, avec la tables des commandes qui en dépend, donnera un message d'erreur comme celui-ci:

DROP TABLE produits;

NOTICE:  constraint $1 on table orders 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.

Le message d'erreur contient un indice utile: Si vous ne souhaitez pas effacer les objets dépendants individuellement, vous pouvez lancer

DROP TABLE produits CASCADE;

et tout les objets seront effacés. Dans ce cas, cela n'effacera pas la table des commandes mais seulement la contrainte de clé étrangère. (Si vous voulez vérifier ce que DROP ... CASCADE fera, lancez DROP sans CASCADE et lisez les messages NOTICE.)

Toutes les commandes de suppression dans PostgreSQL supportent l'utilisation de CASCADE. Bien sur, la nature des dépendances varie avec la nature des objets. Vous pouvez aussi écrire RESTRICT au lieu de CASCADE pour obtenir le comportement par défaut qui est d'empêcher les suppressions d'objets sur lesquelles dépendent d'autres objets.

Note : D'après le standard SQL, spécifier l'un de RESTRICT ou CASCADE est requis. Aucun système de base de donnée ne l'implémente de cette manière actuellement 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 en série des versions de PostgreSQL antérieures à 7.3 ne seront pas maintenus ou crées pendant le processus de mise à jour. Tout autre type de dépendance sera proprement crée pendant une mise à jour.