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.