我试着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;
The 手动开启ALTER FUNCTION http://www.postgresql.org/docs/current/interactive/sql-alterfunction.html很清楚:
您必须拥有该功能才能使用ALTER FUNCTION
.改变一个函数的
架构,您还必须有CREATE
新模式的特权。
要改变所有者,您还必须是直接或间接所有者
新拥有角色的成员,并且该角色必须具有CREATE
函数模式的特权。 (这些限制强制要求
改变所有者不会做任何你不能通过删除和做的事情
重新创建该函数。然而,超级用户可以改变所有权
无论如何,任何功能。)
大胆强调我的。
您还需要一些基本权限来创建函数。根据文档: http://www.postgresql.org/docs/current/interactive/sql-createfunction.html
为了能够定义函数,用户必须具有USAGE
语言上的特权。
...
为了能够创建函数,您必须具有USAGE
对参数类型和返回类型的特权。
简单的解决方案是更改功能作为超级用户。 (默认超级用户是postgres
,但任何用户can成为超级用户。)
If您确实需要更改所有函数的所有权,这可以解决问题:
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
schema.
有关更多详细信息和解释,请参阅dba.SE 上有更完整的答案 https://dba.stackexchange.com/questions/9708/is-there-a-means-to-set-the-owner-of-all-objects-in-a-postgresql-database-at-the.
也密切相关:
在不知道参数数量/类型的情况下删除函数? https://stackoverflow.com/questions/7622908/drop-function-without-knowing-the-number-type-of-parameters/7623246#7623246
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)