Saya telah mendapatkan dump database PostgreSQL saya dengan:
pg_dump -U user-name -d db-name -f dumpfile
yang kemudian saya lanjutkan untuk memulihkan di database lain dengan:
psql X -U postgres -d db-name-b -f dumpfile
Masalah saya adalah bahwa database berisi batasan referensi, pemeriksaan dan pemicu dan beberapa di antaranya (cek tampaknya akan khususnya) gagal selama restorasi karena informasi tidak dimuat dalam urutan yang akan menyebabkan pemeriksaan tersebut dihormati. Misalnya, memasukkan baris dalam tabel dapat dikaitkan dengan fungsi CHECK
panggilan plpgsql
yang memeriksa apakah suatu kondisi berlaku di beberapa tabel lain yang tidak terkait. Jika tabel terakhir itu tidak dimuat oleh psql
sebelum yang pertama, kesalahan terjadi.
Berikut ini adalah SSCCE yang menghasilkan database yang pernah dibuang pg_dump
tidak dapat dipulihkan:
CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;
CREATE TABLE IF NOT EXISTS a (
i INTEGER NOT NULL
);
INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
i INTEGER NOT NULL
);
INSERT INTO b(i) VALUES (0);
ALTER TABLE a ADD CONSTRAINT a_constr_1 CHECK (fail_if_b_empty());
Apakah ada cara untuk menonaktifkan (dari baris perintah) semua kendala seperti itu selama restorasi dump dan mengaktifkannya kembali setelah itu? Saya menjalankan PostgreSQL 9.1.
CHECK
batasan, maka semua jaminan dibatalkan, karena itu tidak didukung secara resmi, hanya ditoleransi. Tetapi menyatakan CHECK
kendala NOT VALID
membuatnya bekerja untuk saya dalam segala hal. Mungkin ada kasing sudut yang tidak pernah saya sentuh ...
-X
dan-d
opsi untukpg_dump
.pg_dump
menghasilkan dump yang dapat disimpan dalam DB kosong.