2

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

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

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

然后我尝试设置search_pathstatic_data_new. 但是当我这样做时,视图仍然引用旧表!

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

4

1 回答 1

3

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

  1. DELETE您的意见CREATE并在您的新表格就位后重新提出意见。简单快速,只要您有完整的创建脚本。也不要忘记重置权限。但是,重新创建脚本可能编译起来很乏味。

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

    search_path可以为每个函数预先设置,或者执行search_path角色对没有明确模式限定的对象有效。此相关答案中的详细说明和链接SO 。

    函数基本上就像准备好的语句,其行为与视图略有不同。dba.SE 上此相关答案中的详细信息。

  3. 为新数据采用TRUNCATEandINSERT路由而不是DELETEand CREATE。然后所有引用保持不变。在这里找到更详细的答案。

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

于 2012-05-12T01:05:48.320 回答