sql >> Base de Datos >  >> RDS >> PostgreSQL

Reemplace todas las tablas de una base de datos excepto una, con datos de otra base de datos

Para hacer una copia de seguridad de una sola tabla, use COPY desde dentro de la base de datos:

COPY user_tbl TO '/path/to/file';

o pg_dump del caparazón:

pg_dump -t user_tbl mydb > user_tbl.sql

Luego suelte la base de datos, restaure su nueva versión, vacíe user_tbl y usa COPY FROM para restaurar la tabla:

COPY user_tbl FROM  '/path/to/file';

o restaurar la copia de seguridad con una tabla desde el shell con psql :

psql -f user_tbl.sql mydb

Identificar tablas dependientes

Rápido y sucio

No existe tal cosa como "COPIA... CASCADA". El método más simple para identificar las tablas dependientes sería iniciar una transacción, llamar a TRUNCATE tbl CASCADE y registra los avisos que recibes:

BEGIN;
TRUNCATE user_tbl CASCADE;

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

Luego revierta la transacción, para que nada cambie realmente:

ROLLBACK;

Cuidado con eso. Si COMMIT el truncado pasa.

Lento y seguro

Bueno, en realidad no es "lento", pero el código es mucho más complejo. Sin embargo, esto no requiere un bloqueo exclusivo en las tablas involucradas, por lo que es mucho más limpio y 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;

Devoluciones:

tbl
------
tbl1
tbl2
tbl3

Uso un CTE recursivo (requiere PostgreSQL 8.4 o posterior) en la tabla del catálogo pg_constraint , porque cada tabla puede tener dependencias a su vez.
Use UNION , no UNION ALL para evitar la evaluación múltiple de tablas que podrían estar vinculadas con múltiples claves externas directa o indirectamente.