Stack Overflow Q & A Modify OWNER on all tables 同时在 PostgreSQL中描述了一些将表和其他对象更改为特定用户的绝妙方法,并且它工作得很好,但是所有建议似乎都忽略了我创建的函数。
是否有一种相当简单的方法来重置数据库中所有对象的所有者,包括函数?手工操作是非常不可取的。
Stack Overflow Q & A Modify OWNER on all tables 同时在 PostgreSQL中描述了一些将表和其他对象更改为特定用户的绝妙方法,并且它工作得很好,但是所有建议似乎都忽略了我创建的函数。
是否有一种相当简单的方法来重置数据库中所有对象的所有者,包括函数?手工操作是非常不可取的。
如果您确切地知道自己在做什么,那么您应该只直接操作系统目录。它可能会产生意想不到的副作用。或者,您可能会损坏数据库(或整个数据库集群)而无法修复。
杰里米的回答虽然基本上可以解决问题,但不建议公众使用。它无条件地更改模式中的所有功能。您确定没有影响系统功能或附加模块安装的功能吗?
更改已经属于指定所有者的功能的所有者也是没有意义的。
首先,检查是否
REASSIGN OWNED
适合您:您必须列出所有要明确拒绝的角色。但它也重新分配了功能。
将给定模式中的所有函数(而不是其他对象)分配给新所有者(可选地,不管以前的所有者):
这会生成规范的 SQL 命令
ALTER FUNCTION ...
来更改所有函数(在指定的模式中)。在执行之前检查命令 - 一个一个或一次全部:转换 to
regprocedure
产生一个带参数的有效函数名,在必要时用双引号括起来,在必要时为当前search_path
.为了简单起见,还使用对象标识符类型
regnamespace
regrole
。WHERE
我添加了一些您可能想要用来过滤结果的注释子句。您可以将所有这些放入
DO
语句或函数中,如相关答案中所示:对于 Postgres 9.4 或更早版本:
聚合函数
string_agg()
需要 PostgreSQL 9.0 或更高版本。在旧版本中替换为array_agg()
andarray_to_string()
。我使用此函数来更改表、函数、类型等的所有者。您可以更改游标的查询以使其适应您的需要。
然后我就执行(如果要调试输出只需将第二个参数设置为 true):
这应该适用于功能:
只需转储数据库模式,然后使用 GnSa 或“Grep n Sed away”
好吧,我没有找到一个一步的过程,但这会处理我在数据库中可以看到的所有对象: