PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Sostituisci tutte le tabelle di un database tranne una, con i dati di un altro db

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.