PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Remplacer toutes les tables d'une base de données sauf une, par des données d'une autre base de données

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.