这是我的设置。我有两个架构:my_app
和static_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
获得引用表的视图?感谢。
答案 0 :(得分:3)
视图绑定到底层的对象。重命名对象不会影响此链接 我基本上看到 3种不同的方式来处理你的问题:
DELETE
您的观点,并在您的新表格到位后重新CREATE
。只要您将完整的创建脚本放在一起,就可以简单快速地完成。不要忘记重置权限。但是,重新创建的脚本可能很难编译。
使用表格函数(函数RETURNING SETOF rows
或RETURNING TABLE
)而不是视图。从而得到“后期绑定”:对象名称将在执行时在系统目录中查找,而不是在创建时查找。事实上,你可以找到这些物品。
search_path
可以是pre-set per function,或者执行角色的search_path
对于未明确模式限定的对象有效。 this related answer on SO中的详细说明和链接。
函数基本上类似于预处理语句,并且与视图略有不同。详情请见this related answer on dba.SE。
对新数据采用 TRUNCATE
和INSERT
路由,而不是DELETE
和CREATE
。然后所有参考保持不变。查找有关here的详细答案。
如果外键引用了您的表,则必须使用DELETE FROM TABLE
- 或者删除并重新创建外键约束。您的责任是可以恢复参照完整性,或者重新创建外键将会失败。