我正在使用 PostgreSQL 来存储大量业务数据以用于数据仓库目的。我正在编写视图来自定义物化表。
我想知道是否可以设置一个不可更新的视图。
我查了postgresql手册,但没有找到具体的答案。
提前非常感谢。
接受的答案已经过时 - PostgreSQL 目前支持可更新视图,因此问题实际上是相关的:
https://www.postgresql.org/docs/14/rules-views.html#RULES-VIEWS-UPDATE
为了使视图不可更新,只需避免向视图的任何角色授予 INSERT/UPDATE/DELETE 权限(或撤销此类权限(如果已授予)。
答案归功于 RhodiumToad (https://twitter.com/rhodiumtoad, https://github.com/RhodiumToad)
PostgreSQL 没有可更新的视图,您必须创建 RULE 才能使之成为可能。如果没有这些额外的规则,您就无法对视图进行更新。
摘自手册:
如果视图被命名为 INSERT、UPDATE 的目标关系, 或删除?完成后 如上所述的替换,我们将 有一个查询树,其中的结果 子查询中的关系点 范围表条目。这行不通, 所以重写器会抛出一个错误,如果 看到它产生了这样的东西。
PostreSQL 中的视图不可更新。
作为其他答案的替代方案,您可以将
OFFSET 0
添加到您的查询中,即:
CREATE VIEW my_view AS (SELECT * FROM my_table OFFSET 0);
现在插入my_view会产生错误:
包含 LIMIT 或 OFFSET 的视图不能自动更新。