Tôi đã phải thực hiện một số thử nghiệm với một đoạn script ngắn để cập nhật một số dữ liệu "di sản" trong một trong các bảng của mình.
Thận trọng như tôi, sử dụng một tập lệnh chưa được kiểm tra, tôi quyết định sao lưu bảng có liên quan trước khi thực hiện. Cách đơn giản nhất để làm điều đó là:
pg_dump -a --file table.sql -t table database
Bây giờ tôi đã làm những gì tôi phải làm, kiểm tra kết quả và thấy chúng không đạt yêu cầu. Tôi tự nghĩ: mình thật may mắn khi có một bản sao lưu của cái bàn đó.
Tôi đã được cảnh báo khi tôi sao lưu bảng rằng:
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.
Tôi đã không nghĩ nhiều về nó, nhưng bây giờ chúng tôi có một vấn đề. Thật vậy, bảng trong câu hỏi có nhiều kích hoạt được đính kèm, nhưng tôi không thể khôi phục table.sql
tùy chọn với --disable-triggers
lệnh pg_restore.
Nếu tôi thử làm theo lệnh tôi nhận được thông báo lỗi:
pg_restore -a -d database -t table -h localhost --disable-triggers table.sql
cụ thể là:
pg_restore: [archiver] input file appears to be a text format dump. Please use psql.
Có một lá cờ cho psql
-command thể hiện hành vi tương tự như --disable-triggers
?
Tôi đã kiểm tra "manpage" psql , tìm kiếm kích hoạt và các từ khóa tương tự nhưng không tìm thấy gì.
Hoặc là tùy chọn duy nhất tôi phải bỏ các kích hoạt trên bảng trước khi khôi phục dữ liệu?
Sidenote: Tôi đang sử dụng postgres v. 9.3 trên Hệ thống Ubuntu 14.10
Nó được đề xuất để chỉnh sửa tệp sql được tạo, để bao gồm câu lệnh:
ALTER TABLE table DISABLE TRIGGER ALL
Khi tôi thực thi: psql -d database -f table.sql
Tôi nhận được một thông báo lỗi về việc vi phạm ràng buộc "Duy nhất" của khóa chính.
Để khắc phục điều này, tôi đã cố gắng bọc bản sao vào:
BEGIN TRANSACTION READ WRITE;
TRUNCATE TABLE table;
-- copy here
COMMIT;
Bây giờ thông báo lỗi là:
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
Cảnh báo sau lặp lại cho mỗi \N
(tượng trưng cho giá trị null) trong kết xuất.
BEGIN TRANSACTION READ WRITE; TRUNCATE TABLE table;
bảo mật dữ liệu của mình, tôi nhận được thông báo về các lệnh không hợp lệ :(
COPY
với mộtALTER TABLE table DISABLE TRIGGER ALL
và có thể nhận được những thứ này vào cuối.