我尝试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;
关于该手册的内容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_%'
仅限public
架构。
有关更多详细信息和说明,请参考dba.SE上的此更完整的答案。
也密切相关:
DROP FUNCTION不知道参数的数量/类型?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句