我尝试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;
答案 0 :(得分:5)
您必须拥有使用
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?