我已经获得了PostgreSQL数据库的转储,其中包括:
pg_dump -U user-name -d db-name -f dumpfile
然后我继续使用以下命令在另一个数据库中还原:
psql X -U postgres -d db-name-b -f dumpfile
我的问题是数据库包含引用约束,检查和触发器,并且其中某些(特别是看起来是检查的)约束在恢复期间失败,因为未按照导致遵守这些检查的顺序来加载信息。例如,在表中插入行可能与CHECK
调用plpgsql
函数检查条件是否存在于其他不相关的表中的函数相关联。如果后一个表未psql
在前一个表之前加载,则会发生错误。
以下是产生这样的数据库的SSCCE,该数据库一旦被转储pg_dump
就无法恢复:
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());
有没有一种方法可以在转储恢复期间禁用(从命令行)所有这些约束,然后再将其重新启用?我正在运行PostgreSQL 9.1。
CHECK
约束中引用其他表的函数,那么所有保证都将失效,因为这不是官方支持的,只是可以容忍的。但是,声明CHECK
约束NOT VALID
使其在各个方面都对我有用。可能有些极端的情况我从未碰过……
-X
和的-d
选项pg_dump
。pg_dump
产生转储是在一个空数据库恢复。