Ho dovuto eseguire alcuni test con un breve script per aggiornare alcuni dati "legacy" in una delle mie tabelle.
Cautamente come sono, usando uno script non testato, ho deciso di eseguire il backup della tabella pertinente prima di farlo. Il modo più semplice per farlo era:
pg_dump -a --file table.sql -t table database
Ora ho fatto quello che dovevo fare, ho controllato i risultati e li ho trovati piuttosto insoddisfacenti. Ho pensato a me stesso: quanto sono fortunato ad avere un backup di quel tavolo.
Ero già stato avvertito quando ho eseguito il backup del tavolo che:
pg_dump: NOTICE: there are circular foreign-key constraints among these table(s):
pg_dump: table
pg_dump: You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.
pg_dump: Consider using a full dump instead of a --data-only dump to avoid this problem.
Non ci ho pensato molto, ma ora abbiamo un problema. In effetti alla tabella in questione sono associati più trigger, ma non riesco a ripristinare l' table.sql
opzione with --disable-triggers
del comando pg_restore.
Se provo a seguire il comando ricevo un messaggio di errore:
pg_restore -a -d database -t table -h localhost --disable-triggers table.sql
vale a dire:
pg_restore: [archiver] input file appears to be a text format dump. Please use psql.
Esiste una bandiera per il psql
comando che presenta lo stesso comportamento di --disable-triggers
?
Ho già controllato la "manpage" di psql , cercando parole chiave trigger e simili ma non ho trovato nulla.
O è l'unica opzione che devo rilasciare i trigger sul tavolo prima di ripristinare i dati?
Sidenote: sto usando Postgres v. 9.3 su un sistema Ubuntu 14.10
È stato suggerito di modificare il file sql generato, per includere l'istruzione:
ALTER TABLE table DISABLE TRIGGER ALL
Quando ora eseguito: psql -d database -f table.sql
ho ricevuto un messaggio di errore sulla violazione del vincolo "Unico" della chiave primaria.
Per risolvere questo problema ho cercato di avvolgere la copia in:
BEGIN TRANSACTION READ WRITE;
TRUNCATE TABLE table;
-- copy here
COMMIT;
Ora il messaggio di errore è:
psql:project_backup.sql:18: ERROR: cannot truncate a table referenced in a foreign key constraint
DETAIL: Table "another" references "table".
HINT: Truncate table "another" at the same time, or use TRUNCATE ... CASCADE.
psql:project_backup.sql:20: ERROR: current transaction is aborted, commands ignored until end of transaction block
psql:project_backup.sql:21: invalid command \N
psql:project_backup.sql:22: invalid command \N
Quest'ultimo avviso si ripete per ciascuno \N
(che simboleggia il valore null) nel dump.
BEGIN TRANSACTION READ WRITE; TRUNCATE TABLE table;
proteggere i miei dati, mi vengono inondati di messaggi su comandi non validi :(
COPY
con unALTER TABLE table DISABLE TRIGGER ALL
e riattivare questi alla fine.