授予用户ALTER功能的权限

Jua*_*eza 2 postgresql privileges plpgsql

我尝试ALTER使用新用户的函数,我得到错误:

ERROR:  must be owner of function ACases
********** Error **********

ERROR: must be owner of function ACases
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)

我必须给予用户什么权限才能实现ALTER这一功能?我发现的唯一方法是让用户成为OWNER该功能的用户.

但如果是这种情况,只有一个用户(所有者)可以使用ALTER该功能.那么如何更改OWNER所有功能呢?

CREATE OR REPLACE FUNCTION public."ACases"(caseid integer)
  RETURNS boolean AS
$BODY$
DECLARE
BEGIN
        RETURN FALSE;
END;
$BODY$
  LANGUAGE plpgsql;
ALTER FUNCTION public."ACases"(integer) OWNER TO postgres;

GRANT ALL PRIVILEGES ON FUNCTION public."ACases"(integer) TO user_name;
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 5

人工ALTER FUNCTION是清楚这一点:

您必须拥有要使用的功能ALTER FUNCTION.要更改函数的架构,您还必须拥有CREATE新架构的权限.要更改所有者,您还必须是新拥有角色的直接或间接成员,并且该角色必须CREATE 对该函数的架构具有特权.(这些限制强制要求通过删除和重新创建函数来改变所有者不会执行任何操作.但是,超级用户无论如何都可以更改任何函数的所有权.)

大胆强调我的.
您还需要一些基本权限来创建函数.每个文件:

为了能够定义函数,用户必须拥有USAGE该语言的特权.
...

为了能够创建函数,您必须具有USAGE参数类型和返回类型的特权.

简单的解决方案是将功能更改为超级用户.(默认超级用户是postgres,但任何用户可以成为超级用户.)

如果你真的需要改变所有功能的所有权,这就可以了:

SELECT string_agg('ALTER FUNCTION '
            || quote_ident(n.nspname) || '.' 
            || quote_ident(p.proname) || '(' 
            || pg_catalog.pg_get_function_identity_arguments(p.oid)
            || ') OWNER TO foo;'
          , E'\n') AS _sql
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_%'
Run Code Online (Sandbox Code Playgroud)

受限于public架构.
有关更多详细信息和解释,请参阅有关dba.SE的更完整答案.
还密切相关:
DROP FUNCTION不知道参数的数量/类型?