当我在我的数据库上运行 pg_dump 时,它会将我的一个视图 (orders_plus) 转换为一个表,然后创建一个我猜想将其放回视图的规则。这似乎没问题(虽然很奇怪)。但是,就在“创建规则”之后,它放置了这一行:
ALTER VIEW orders_plus SET ();
这不是一个有效的命令,因此在恢复数据库时出现错误。
当我在我的数据库上运行 pg_dump 时,它会将我的一个视图 (orders_plus) 转换为一个表,然后创建一个我猜想将其放回视图的规则。这似乎没问题(虽然很奇怪)。但是,就在“创建规则”之后,它放置了这一行:
ALTER VIEW orders_plus SET ();
这不是一个有效的命令,因此在恢复数据库时出现错误。
pg_dump 永远不应该这样做。这是您的服务器或客户端的问题。既然你是从 Apple 那里得到的,它可能是定制的跟进他们。
我的猜测是其中一个pg_get_*
功能失败了。这可能是系统表中数据的问题,也可能是服务器端功能的问题。但我以前从未在其他任何地方见过这样的事情,所以苹果将是开始的地方。
... 3年后...
似乎您偶然发现了 v9.2.1 中的一个错误,该错误已在 v9.2.2 中修复。
请参阅v9.2.2 发行说明:
修复 pg_dump 用于具有循环依赖且没有关系选项的视图 (Tom Lane)
当视图涉及循环依赖时,先前对转储关系选项的修复不适用于视图没有选项的情况;它发出了无效语法的 ALTER VIEW foo SET ()。
我最近在恢复/迁移生产数据库时注意到了完全相同的问题。我错误地使用了旧版本的 pg_dump 而不是数据库;)
psql:dump.sql:27821784: ERROR: syntax error at or near ")"
LINE 1: ALTER VIEW <viewname> SET ();
使用 pg_dump v9.2.6 时问题消失了。
为了完整起见,这里有一些软件信息:Postgres 版本 9.2.6 GNU/Linux 2.6.18-406.el5 #1 SMP Fri May 1 10:37:57 EDT 2015 x86_64。红帽企业版 5.11 (Tikanga)。