如何在PostgreSQL中更改所有视图的所有者

4
数据库中,存储了125个视图。其中75个视图的所有者是sa。那么,有没有一种方法可以将拥有者为sa的视图更改为postgres?
2个回答

13

查找与所有者 sa 相关联的视图

select 
      viewname 
from 
      pg_catalog.pg_views
where
      schemaname NOT IN ('pg_catalog', 'information_schema') 
and 
      viewowner = 'sa'

要更改视图的所有者,我们可以使用:ALTER VIEW <view_name> OWNER TO <owner_name>
根据文档:

ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression
ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name DROP DEFAULT
ALTER VIEW [ IF EXISTS ] name OWNER TO new_owner
ALTER VIEW [ IF EXISTS ] name RENAME TO new_name
ALTER VIEW [ IF EXISTS ] name SET SCHEMA new_schema
ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] )
ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] )

最后,要查找与所有者saALTER相关联的视图,请使用以下命令:

do $$
declare
    myrow record;
begin
for myrow in
select 
     'ALTER VIEW '||quote_ident(v.viewname)||' OWNER TO "postgres";' as viewq
from 
    (select 
      viewname 
from 
      pg_catalog.pg_views
where
      schemaname NOT IN ('pg_catalog', 'information_schema') 
and 
      viewowner = 'sa'
    ) v
loop
execute myrow.viewq;
end loop;
end;
$$;

你好,我完全是pl/sql的新手。经过快速搜索,我发现在pl/sql中找不到“record”类型。而且括号后面写的“v”似乎是一个缩写。这种语法叫什么?我想搜索并学习如何在其他情况下使用它。谢谢! - user10661584
@kumom 当你提到 PostgreSQL 搜索 pl/pgsql 时,请参考此处的声明v是我给子选择器 select viewname from pg_catalog.pg_views where schemaname NOT IN ('pg_catalog', 'information_schema') and viewowner = 'sa'指定的别名。 - Vivek S.

1
要更改 sa 拥有的 所有 对象,您可以使用 重新分配拥有者
要更改单个视图,您可以使用 修改视图
您应该能够脚本化第二个链接中的过程。

实际上这不是我想要的。 - user3814846

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接