有没有办法同时设置PostgreSQL数据库中所有对象的所有者?

https://stackoverflow.com/questions/1348126/modify-owner-on-all-tables-simultaneously-in-postgresql描述了将表和其他对象更改为特定用户的一些漂亮方法,并且它可以游动,但是所有建议似乎都忽略了我创建的功能.

是否有一种相当简单的方法来重置数据库中所有对象的所有者,包括函数?手工操作是非常不受欢迎的.

最佳答案
如果您确切知道自己在做什么,那么您应该直接操作系统目录.它可能有意想不到的副作用.或者您可以破坏数据库(或整个数据库集群)无法修复.

Jeremy’s answer,虽然基本上是这样做的,但对一般公众来说并不可取.它无条件地更改模式中的所有函数.您确定没有其他模块影响系统功能或安装功能吗?
更改已属于指定所有者的函数的所有者也是毫无意义的.

首先,检查REASSIGN OWNED是否适合您:

change the ownership of database objects owned by a database role

您必须明确列出要被拒绝的所有角色.但它也重新分配功能.

将给定模式中的所有函数(而不是其他对象)分配给新所有者(可选地,不管以前的所有者):

SELECT string_agg('ALTER FUNCTION ' || oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  n.nspname = 'public';
-- AND p.relowner <> (SELECT oid FROM pg_roles WHERE rolname = 'foo')
-- AND p.proname ~~ 'f_%'

这将生成canonical SQL commands ALTER FUNCTION ...以更改所有功能(在指定的架构中).您可以在执行命令之前检查命令 – 逐个或一次执行:

ALTER FUNCTION public.bar(text, text) OWNER TO foo;
ALTER FUNCTION public.foo(x integer) OWNER TO foo;
...

我包含了一些您可能想用来过滤结果的评论WHERE子句.

对regprocedure的强制转换生成带有参数的有效函数名,必要时双引号,在当前search_path必要时进行模式限定.

聚合函数string_agg()需要PostgreSQL 9.0或更高版本.在旧版本中使用array_agg()和array_to_string()替换.

您可以将所有这些放入DO语句或此相关答案中演示的函数中:

> Drop all functions in a namespace? (Execute generated DDL commands?)

在Postgres 9.5或更高版本中,您可以使用新的object identifier types regnamespace and regrole简化查询:

SELECT string_agg('ALTER FUNCTION '|| oid::regprocedure || ' OWNER TO foo;', E'\n') AS ddl
FROM   pg_catalog.pg_proc
WHERE  pronamespace = 'public'::regnamespace;
-- AND relowner <> 'foo'::regrole
-- AND proname ~~ 'f_%'

转载注明原文:有没有办法同时设置PostgreSQL数据库中所有对象的所有者? - 代码日志