如何在postgresql中创建只读视图,类似于oracle?



我想在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;

最新更新