vô hiệu hóa các ràng buộc trước khi sử dụng pg_restore.exe


16

Khi tôi cố gắng thực hiện pg_restore.exemột tệp kết xuất từ ​​cơ sở dữ liệu, nó sẽ gây ra hàng tá lỗi, tất cả đều giống nhau:

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

Điều này rõ ràng là do thực tế là tôi đã làm trống cơ sở dữ liệu trước khi khôi phục nó khỏi tệp kết xuất (tệp này xuất phát từ cơ sở dữ liệu sản xuất) ... tất nhiên không có ràng buộc khóa ngoại nào có thể ổn nếu một bảng tham chiếu trống ...

Có cách nào để vô hiệu hóa các ràng buộc và tất cả các khóa ngoại, cho tất cả các bảng, trước khi tôi gọi pg_restore.exevà sau đó, kích hoạt lại các ràng buộc và khóa ngoại.

Trong SO tôi đã tìm thấy một điều thú vị: trì hoãn kiểm tra ràng buộc để cam kết thời gian . Nhưng tôi không nghĩ rằng tôi có thể gọi pg_restore.exetừ bên trong psql.exesau khi trì hoãn các ràng buộc.

Ngoài ra còn có bài đăng này , có từ 10 năm trước, đề nghị bỏ sau đó thêm lại các ràng buộc. Hoặc để thay đổi giá trị của trình chuyển đổi pg_ class thành 0 và điều đó cũng có thể xảy ra đối với các ràng buộc ... nhưng tôi e rằng nó bị hack nhiều hơn là thực hành tốt ...

Bạn khuyên gì, thực hành tốt nhất trong trường hợp này là gì? Việc sử dụng pg_dump.exe với -cleancờ có tạo ra kết xuất bỏ qua việc kiểm tra các ràng buộc khi khôi phục cơ sở dữ liệu không?


Đăng chéo tại đây, trong trường hợp bất cứ ai tìm thấy điều này sau: stackoverflow.com/questions/12093654/iêu
Craig Ringer

Câu trả lời:


28

Bạn đã thử --disable-triggerstùy chọn này pg_restorechưa?

Theo tài liệu: Sử dụng tài liệu này nếu bạn có kiểm tra tính toàn vẹn tham chiếu hoặc các kích hoạt khác trên các bảng mà bạn không muốn gọi trong khi tải lại dữ liệu.

Xin lưu ý rằng điều này chỉ hợp lệ cho việc --data-onlykhôi phục và yêu cầu --superuser=usernametùy chọn phải được thông qua.


Và nó hoạt động như một bùa mê ...
Stephane Rolland
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.