nonaktifkan kendala sebelum menggunakan pg_restore.exe

16

Ketika saya mencoba mengeksekusi pg_restore.exefile dump dari database, ia membuang lusinan kesalahan, semuanya sama:

ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName"

Ini jelas karena fakta bahwa saya telah mengosongkan basis data sebelum mengembalikannya dari file dump (file ini berasal dari basis data produksi) ... maka tentu saja tidak ada batasan kunci asing yang boleh ok jika satu tabel yang direferensikan kosong ...

Apakah ada cara untuk menonaktifkan batasan dan semua kunci asing, untuk semua tabel, sebelum saya panggil pg_restore.exe, dan setelah itu, aktifkan kembali kendala dan kunci asing.

Di SO saya menemukan sesuatu yang menarik: menunda memeriksa kendala untuk melakukan waktu . Tapi saya tidak berpikir saya bisa menelepon pg_restore.exedari dalam psql.exesetelah menunda kendala.

Ada juga postingan ini , yang berasal dari 10 tahun yang lalu, menyarankan untuk drop kemudian menambahkan kembali kendala. Atau untuk mengubah nilai reltriggers pg_class ke 0 dan itu juga mungkin untuk kendala ... tapi saya khawatir ini lebih meretas daripada praktik yang baik ...

Apa yang Anda sarankan, apa praktik terbaik dalam kasus ini? Apakah menggunakan pg_dump.exe dengan -cleanflag menciptakan dump yang melewati kendala memeriksa ketika mengembalikan database?

Stephane Rolland
sumber
Diposting silang di sini, kalau-kalau ada yang menemukan ini nanti: stackoverflow.com/questions/12093654/…
Craig Ringer

Jawaban:

28

Sudahkah Anda mencoba --disable-triggersopsi pg_restore?

Per dokumentasi: Gunakan ini jika Anda memiliki pemeriksaan integritas referensial atau pemicu lain pada tabel yang tidak ingin Anda panggil saat memuat ulang data.

Harap dicatat bahwa ini hanya valid untuk --data-onlypengembalian dan mengharuskan --superuser=usernameopsi untuk diteruskan juga.

Matthew Wood
sumber
Dan itu bekerja seperti pesona ...
Stephane Rolland