2012-05-11 49 views
2

这是我的设置。我有两个模式:my_appstatic_data。后者从静态转储中导入。对于我的应用程序逻辑的需求,我提出了使用static_data表的视图,并将它们存储在my_app模式中。PostgreSQL:当另一个架构的视图依赖于它时更新架构

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

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

然后我尝试设置search_pathstatic_data_new。但是当我这样做的时候,这些观点仍然参考旧桌子!

是否有可能使用search_path来引用表的视图?谢谢。

回答

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. 采取新的数据,而不是DELETECREATETRUNCATEINSERT路线。然后所有引用保持不变。找到关于该here更详细的答案。

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

+0

感谢您的回答!我想最简单的是使用1.并将'my_app'表存储在另一个模式中。 – Artefact2

+0

@ Artefact2:我发现[pgAdmin](http://www.pgadmin.org/)对这种操作非常有用。它提供完整的删除并为任何选定的对象创建脚本。 –

+0

是的,我也使用它,虽然'pg_dump'和'pg_restore'只是更方便脚本等。 – Artefact2