如何在PostgreSQL中获取数据库中的函数列表及其参数?

时间:2014-06-04 09:20:41

标签: function postgresql permissions plpgsql

我有一个拥有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>;

2 个答案:

答案 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 $$;