PostgreSQL:当来自另一个模式的视图依赖于它时更新模式

时间:2012-05-11 23:54:54

标签: postgresql views schema

这是我的设置。我有两个架构:my_appstatic_data。后者是从静态转储导入的。为了满足我的应用程序逻辑的需要,我创建了使用static_data表的视图,并将它们存储在my_app模式中。

一切都很好。但我需要使用新转储更新static_data架构,并让我的视图使用新数据。问题是,无论我做什么,我的观点总是会引用旧的架构!

我尝试在新架构static_data_new中导入新转储,然后尝试删除static_data并将static_data_new重命名为static_data。它不起作用,因为我的视图依赖于static_data中的表格,因此PostgreSQL不会让我删除它。

然后我尝试将search_path设置为static_data_new。但是,当我这样做时,观点仍然参考旧桌子!

是否可以使用search_path获得引用表的视图?感谢。

1 个答案:

答案 0 :(得分:3)

视图绑定到底层的对象。重命名对象不会影响此链接 我基本上看到 3种不同的方式来处理你的问题:

  1. DELETE您的观点,并在您的新表格到位后重新CREATE。只要您将完整的创建脚本放在一起,就可以简单快速地完成。不要忘记重置权限。但是,重新创建的脚本可能很难编译。

  2. 使用表格函数(函数RETURNING SETOF rowsRETURNING TABLE)而不是视图。从而得到“后期绑定”:对象名称将在执行时在系统目录中查找,而不是在创建时查找。事实上,你可以找到这些物品。

    search_path可以是pre-set per function,或者执行角色的search_path对于未明确模式限定的对象有效。 this related answer on SO中的详细说明和链接。

    函数基本上类似于预处理语句,并且与视图略有不同。详情请见this related answer on dba.SE

  3. 对新数据采用 TRUNCATEINSERT 路由,而不是DELETECREATE。然后所有参考保持不变。查找有关here的详细答案。

    如果外键引用了您的表,则必须使用DELETE FROM TABLE - 或者删除并重新创建外键约束。您的责任是可以恢复参照完整性,或者重新创建外键将会失败。