我想在PostgreSQL中创建只读视图。我们可以在Oracle中创建,但不能在PostgreSQL中创建。
我尝试创建只读视图,但在只读时出现语法错误。
CREATE OR REPLACE VIEW VIEW NAME()
from table names
where filter condition1=filter
condition2
with READ ONLY;
但是READ ONLY
在PostgreSQL中不起作用。如何在PostgreSQL中创建只读视图?
我不认为Postgres提供了一种将视图显式定义为read-onöy的方法。
文档指出:
简单视图可自动更新
然而:
默认情况下,不满足所有这些条件的更复杂的视图是只读的。
该文档列出了只读视图的限制:
如果视图满足
以下所有条件,则视图可自动更新:
视图的 FROM 列表中必须只有一个条目,该条目必须是表或其他可更新的视图。
视图定义不得在顶层包含 WITH、DISTINCT、GROUP BY、HAVE、LIMIT 或 OFFSET 子句。
视图定义不得在顶层包含集合操作(联合、相交或例外(。
视图的选择列表不得包含任何聚合、窗口函数或集合返回函数。
简单视图是可自动更新的:系统将允许在视图上使用 INSERT、UPDATE 和 DELETE 语句,其方式与在常规表上使用相同。如果视图满足以下所有条件,则视图可自动更新:
视图的 FROM 列表中必须只有一个条目,该条目必须是表或其他可更新的视图。
视图定义不得在顶层包含 WITH、DISTINCT、GROUP BY、HAVE、LIMIT 或 OFFSET 子句。
视图定义不得在顶层包含集合操作(联合、相交或例外(。
视图的选择列表不得包含任何聚合、窗口函数或集合返回函数
除非您的视图满足所有条件,否则它是只读的。如果您有想要设为只读的简单视图,则(次优(选项是调整其定义,使其违反上述规则之一。
例如,您可以添加虚拟WITH
子句:
CREATE VIEW myview AS
WITH dummy AS (SELECT 1)
-- real view definition here
你应该在PostgreSQL中使用权限来处理这个问题。
只需确保没有人有权修改视图即可。
请注意,您还可以撤消视图所有者的权限。
另一种方法是创建一个假连接。任何联接都会立即取消其成为可更新视图的资格。例如:
CREATE VIEW public.west_country as select
city.id,
city_name,
country_id
from public.city
where city.country_id = 1
WITH CHECK OPTION;
这将创建一个可更新的视图。但是,如果您将下面截取的代码与 join 语句一起使用,它将是只读的。
CREATE VIEW public.west_country_rw as select
city.id,
city_name,
country_id
from public.city
left join (select -1 as "id" ) as tmp on tmp.id = city.id
where city.country_id = 1;