使用 psql 和 --disable-triggers 恢复纯文本 pg_dump

Vog*_*612 12 postgresql psql

我不得不用一个简短的脚本执行一些测试来更新我的一个表中的一些“遗留”数据。

尽管我很谨慎,但使用未经测试的脚本,我决定在这样做之前备份相关表。最简单的方法是:

pg_dump -a --file table.sql -t table database
Run Code Online (Sandbox Code Playgroud)

现在我做了我必须做的,检查了结果,发现它们很不令人满意。我心想:有一张桌子的备份我是多么幸运。

当我备份表格时,我已经被警告过:

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.
Run Code Online (Sandbox Code Playgroud)

我没有多想,但现在我们遇到了问题。实际上,有问题的表附加了多个触发器,我无法恢复 pg_restore 命令的table.sqlwith 选项--disable-triggers

如果我尝试以下命令,我会收到一条错误消息:

pg_restore -a -d database -t table -h localhost --disable-triggers table.sql
Run Code Online (Sandbox Code Playgroud)

即:

pg_restore: [archiver] input file appears to be a text format dump. Please use psql.
Run Code Online (Sandbox Code Playgroud)

psql-command是否有一个标志表现出与--disable-triggers?

我已经检查了psql "manpage",搜索 trigger 和类似的关键字,但没有找到任何东西。

或者是我必须在恢复数据之前删除表上的触发器的唯一选择?

旁注:我在 Ubuntu 14.10 系统上使用 postgres v. 9.3


建议编辑生成的 sql 文件,以包含以下语句:

ALTER TABLE table DISABLE TRIGGER ALL
Run Code Online (Sandbox Code Playgroud)

当我现在执行时:psql -d database -f table.sql我收到一条关于违反主键的“唯一”约束的错误消息。

为了解决这个问题,我试图将副本包装成:

BEGIN TRANSACTION READ WRITE;
TRUNCATE TABLE table;

-- copy here

COMMIT;
Run Code Online (Sandbox Code Playgroud)

现在错误信息是:

ALTER TABLE table DISABLE TRIGGER ALL
Run Code Online (Sandbox Code Playgroud)

后一个警告\N对转储中的每个(象征空值)重复。

Vog*_*612 4

@dezso 有完全正确的想法

这一切都意味着一些数据已经更新了,对吗?尝试使用复制原始数据的临时表将它们更新回来

现在唯一剩下的就是让它发生。

这就是我所做的。我借鉴了他的书并手动编辑转储文件以使用名为table_backup. 然后我使用 pgAdmin 中提供的定义创建了该表(但也可以手动完成)。

我省略了触发器和约束以及外键,然后继续使用备份表中的数据“更新”原始表,如下所示:

BEGIN TRANSACTION;
ALTER TABLE table DISABLE TRIGGER ALL;

UPDATE table SET 
    (column1, column2, ...) = 
    (table_backup.column1, table_backup.colum2, ...)
FROM table_backup WHERE table.pk_column = table_backup.pk_column;

ALTER TABLE table ENABLE TRIGGER ALL;
-- I didn't but you can drop table_backup here
COMMIT;
Run Code Online (Sandbox Code Playgroud)

所以我终于回到了原始数据,为下一次测试做好准备;)