Pour ne sauvegarder qu'une seule table, utilisez COPY
depuis l'intérieur de la base de données :
COPY user_tbl TO '/path/to/file';
ou pg_dump
depuis le shell :
pg_dump -t user_tbl mydb > user_tbl.sql
Puis déposez la base de données, restaurez votre nouvelle version, videz user_tbl
et utilisez COPY FROM
pour restaurer la seule table :
COPY user_tbl FROM '/path/to/file';
ou restaurez la sauvegarde avec la seule table du shell avec psql
:
psql -f user_tbl.sql mydb
Identifier les tables dépendantes
Rapide et sale
"COPIER ... CASCADE" n'existe pas. La méthode la plus simple pour identifier les tables dépendantes serait de démarrer une transaction, appelez TRUNCATE tbl CASCADE
et enregistrez les notifications que vous recevez :
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
Ensuite, annulez la transaction - donc rien ne change réellement :
ROLLBACK;
Attention avec ça. Si vous COMMIT
le troncature passe.
Lent et sûr
Eh bien, pas vraiment "lent", mais le code est beaucoup plus complexe. Cela ne prend pas un verrou exclusif sur les tables concernées, donc c'est beaucoup plus propre et plus sûr :
WITH RECURSIVE x AS (
SELECT conrelid::regclass
FROM pg_constraint
WHERE confrelid = 'user_tbl'::regclass
UNION
SELECT p.conrelid::regclass
FROM x
JOIN pg_constraint p ON p.confrelid = x.conrelid
)
SELECT conrelid::text AS tbl
FROM x;
Renvoie :
tbl
------
tbl1
tbl2
tbl3
J'utilise un CTE récursif
(nécessite PostgreSQL 8.4 ou version ultérieure) sur la table de catalogue pg_constraint
, car chaque table peut avoir des dépendances à son tour.
Utilisez UNION
, pas UNION ALL
pour éviter l'évaluation multiple des tables qui pourraient être liées à plusieurs clés étrangères directement ou indirectement.