Tôi đã nhận được một bãi chứa cơ sở dữ liệu PostgreQuery của mình với:
pg_dump -U user-name -d db-name -f dumpfile
Sau đó tôi tiến hành khôi phục trong cơ sở dữ liệu khác với:
psql X -U postgres -d db-name-b -f dumpfile
Vấn đề của tôi là cơ sở dữ liệu chứa các ràng buộc tham chiếu, kiểm tra và kích hoạt và một số trong số đó (kiểm tra có vẻ như cụ thể) không thành công trong quá trình khôi phục do thông tin không được tải theo thứ tự sẽ khiến các kiểm tra đó được tôn vinh. Chẳng hạn, việc chèn một hàng trong một bảng có thể được liên kết với CHECK
một plpgsql
hàm gọi hàm kiểm tra xem một điều kiện có giữ trong một số bảng không liên quan khác hay không. Nếu bảng sau không được tải psql
trước bảng trước, sẽ xảy ra lỗi.
Sau đây là một SSCCE tạo ra một cơ sở dữ liệu như vậy một khi đã bị hủy với pg_dump
không thể được khôi phục:
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());
Có cách nào để vô hiệu hóa (từ dòng lệnh) tất cả các ràng buộc như vậy trong quá trình khôi phục kết xuất và cho phép chúng trở lại sau đó không? Tôi đang chạy PostgreSQL 9.1.
CHECK
ràng buộc, thì tất cả các bảo đảm đều bị hủy, vì điều đó không được hỗ trợ chính thức, chỉ cần dung thứ. Nhưng tuyên bố các CHECK
ràng buộc NOT VALID
làm cho nó hoạt động đối với tôi về mọi mặt. Có thể có những trường hợp góc mà tôi chưa bao giờ chạm vào ...
-X
và-d
lựa chọn chopg_dump
.pg_dump
tạo ra một dump đó là restorable trong một DB trống.