我必须使用一个简短的脚本执行一些测试,以更新我的一张表中的某些“旧版”数据。
我非常谨慎,我使用未经测试的脚本决定先备份相关表。最简单的方法是:
pg_dump -a --file table.sql -t table database
现在我做了我必须做的,检查了结果,发现它们不尽人意。我对自己说:我很幸运能得到那张桌子的备份。
备份表时已经警告过我:
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.
我没怎么想,但现在我们遇到了问题。确实,有问题的表已附加了多个触发器,但是我无法还原 pg_restore命令的table.sql
with选项--disable-triggers
。
如果我尝试执行以下命令,则会收到错误消息:
pg_restore -a -d database -t table -h localhost --disable-triggers table.sql
即:
pg_restore: [archiver] input file appears to be a text format dump. Please use psql.
psql
-command 是否有一个标志与它表现出相同的行为--disable-triggers
?
我已经检查了psql“ manpage”,搜索触发器和类似的关键字,但是什么也没找到。
还是在还原数据之前我必须将触发器放在表上的唯一选择?
旁注:我在Ubuntu 14.10系统上使用Postgres v。9.3
建议编辑生成的sql文件,使其包含以下语句:
ALTER TABLE table DISABLE TRIGGER ALL
现在执行时:psql -d database -f table.sql
我收到一条有关违反主键的“唯一”约束的错误消息。
为了解决这个问题,我尝试将副本包装到:
BEGIN TRANSACTION READ WRITE;
TRUNCATE TABLE table;
-- copy here
COMMIT;
现在错误消息是:
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
对于\N
转储中的每个警告(表示空值),都会重复执行后一个警告。
BEGIN TRANSACTION READ WRITE; TRUNCATE TABLE table;
确保数据安全时,我收到有关无效命令的消息:(
COPY
有ALTER TABLE table DISABLE TRIGGER ALL
,并在年底重新启用这些。