授予用户ALTER功能的权限

时间:2014-06-05 16:43:32

标签: postgresql plpgsql privileges

我尝试ALTER一个新用户的函数,我收到错误:

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

ERROR: must be owner of function ACases
SQL state: 42501

我必须向用户授予哪些权限才能使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;

1 个答案:

答案 0 :(得分:5)

manual on ALTER FUNCTION很清楚:

  

您必须拥有使用ALTER FUNCTION的功能。更改功能   架构,您还必须拥有新架构的CREATE权限。   要改变所有者,您还必须是直接或间接的   新拥有角色的成员,该角色必须具有CREATE   函数模式的特权。 (这些限制强制执行   改变所有者不会做任何你不能做的事情掉落和   重新创建功能。但是,超级用户可以更改所有权   无论如何,任何功能。)

大胆强调我的 您还需要一些基本权限来创建函数。 Per documentation:

  

为了能够定义一个功能,用户必须拥有该语言的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_%'

受限于public架构 有关更多详细信息和说明,请参阅this more complete answer on dba.SE 也密切相关:
DROP FUNCTION without knowing the number/type of parameters?