【问题标题】:Give a user permission to ALTER a function授予用户更改功能的权限
【发布时间】:2014-07-26 18:35:28
【问题描述】:

我尝试使用新用户 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;

【问题讨论】:

    标签: postgresql plpgsql privileges


    【解决方案1】:

    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?

    【讨论】:

    • 哇欧文非常感谢你。非常清晰和详细。前几天我放弃并让该用户成为该功能的所有者。现在我知道问题出在哪里了。
    猜你喜欢
    • 2023-04-02
    • 2018-11-19
    • 1970-01-01
    • 2019-03-22
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多