Per eseguire il backup di una sola tabella, usa COPY
dall'interno del database:
COPY user_tbl TO '/path/to/file';
o pg_dump
dalla shell:
pg_dump -t user_tbl mydb > user_tbl.sql
Quindi rilascia il database, ripristina la tua nuova versione, svuota user_tbl
e usa COPY FROM
per ripristinare una tabella:
COPY user_tbl FROM '/path/to/file';
oppure ripristina il backup con una tabella dalla shell con psql
:
psql -f user_tbl.sql mydb
Identifica le tabelle dipendenti
Veloce e sporco
Non esiste una cosa come "COPIA ... CASCADE". Il metodo più semplice per identificare le tabelle dipendenti sarebbe avviare una transazione, chiamare TRUNCATE tbl CASCADE
e registra gli avvisi che ricevi:
BEGIN;
TRUNCATE user_tbl CASCADE;
NOTICE: truncate cascades to table "tbl1"
NOTICE: truncate cascades to table "tbl2"
NOTICE: truncate cascades to table "tbl3"
Quindi annulla la transazione, quindi nulla cambia effettivamente:
ROLLBACK;
Attento con quello. Se COMMIT
il troncamento passa.
Lento e sicuro
Bene, non in realtà "lento", ma il codice è molto più complesso. Tuttavia, questo non richiede un blocco esclusivo sui tavoli coinvolti, quindi è molto più pulito e sicuro:
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;
Resi:
tbl
------
tbl1
tbl2
tbl3
Uso un CTE ricorsivo
(richiede PostgreSQL 8.4 o successivo) nella tabella del catalogo pg_constraint
, perché ogni tabella può avere dipendenze a sua volta.
Utilizza UNION
, non UNION ALL
per evitare la valutazione multipla di tabelle che potrebbero essere collegate a più chiavi esterne direttamente o indirettamente.