我有一个拥有1000多个功能的数据库。我想授予某些用户执行权限。我无法手动执行此操作,因此我想获取一个函数列表并编写代码以生成所有函数的GRANT EXECUTE脚本。我尝试了以下脚本,但这不是给我参数。我无法通过此查询获取参数。
SELECT 'GRANT EXECUTE ON FUNCTION '||nspname||'.'||proname||' TO gis;'
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p
ON pronamespace = n.oid
WHERE nspname = 'ccdb'
如何使用数据类型获得所需的结果?
像,
GRANT EXECUTE ON FUNCTION <schema_name>.<table_name>(<list of arguments>) TO <user_name>;
答案 0 :(得分:5)
有一个方便的功能可以帮助你:oidvectortypes
。
SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes))
FROM pg_proc p INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid);
显示带参数的所有函数。您可以调整format
咒语以生成任何所需的语句,如果您愿意,可以LOOP
将其生成,以将生成的语句提供给PL / PgSQL中的EXECUTE
。
感谢Leo Hsu and Regina Obe at Postgres Online指出oidvectortypes
。我之前编写过类似的函数,但使用了复杂的嵌套表达式,这个函数摆脱了对。
请注意,在本例中,您不必进行任何自定义SQL生成。 Just use GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA myschema TO ...
如果你最近有一个模糊的PostgreSQL。
答案 1 :(得分:3)
您应该使用pg_get_function_arguments(func_oid).动态GRANT必须在匿名代码块或函数中执行(将 my_schema 和 my_username 更改为实际值):
do $$
declare
funcdef text;
begin
for funcdef in
select format('%s.%s (%s)',
nspname, proname, pg_get_function_arguments(p.oid))
from pg_proc p
join pg_namespace n on pronamespace = n.oid
where nspname = 'my_schema'
and not proisagg
loop
execute format ('GRANT EXECUTE ON FUNCTION %s TO my_username', funcdef);
end loop;
end $$;