PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Substitua todas as tabelas de um banco de dados, exceto uma, por dados de outro banco de dados


Para fazer backup apenas de uma tabela, use COPY de dentro do banco de dados:
COPY user_tbl TO '/path/to/file';

ou pg_dump da casca:
pg_dump -t user_tbl mydb > user_tbl.sql

Em seguida, solte o banco de dados, restaure sua nova versão, esvazie user_tbl e use COPY FROM para restaurar uma tabela:
COPY user_tbl FROM  '/path/to/file';

ou restaure o backup com uma tabela do shell com psql :
psql -f user_tbl.sql mydb

Identifique as tabelas dependentes

Rápido e sujo


Não existe "COPIAR... CASCATA". O método mais simples para identificar tabelas dependentes seria iniciar uma transação, chamar TRUNCATE tbl CASCADE e registre os avisos que você recebe:
BEGIN;
TRUNCATE user_tbl CASCADE;

NOTICE:  truncate cascades to table "tbl1"
NOTICE:  truncate cascades to table "tbl2"
NOTICE:  truncate cascades to table "tbl3"

Em seguida, reverta a transação - para que nada realmente mude:
ROLLBACK;

Cuidado com isso. Se você COMMIT o truncado passa.

Lento e seguro


Bem, não realmente "lento", mas o código é muito mais complexo. No entanto, isso não exige um bloqueio exclusivo nas tabelas envolvidas, por isso é muito mais limpo e seguro:
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;

Devoluções:
tbl
------
tbl1
tbl2
tbl3

Eu uso um CTE recursivo (requer PostgreSQL 8.4 ou posterior) na tabela de catálogo pg_constraint , porque cada tabela pode ter dependências por sua vez.
Use UNION , não UNION ALL para evitar a avaliação múltipla de tabelas que podem estar vinculadas a várias chaves estrangeiras direta ou indiretamente.