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

Posted

技术标签:

【中文标题】如何获取 PostgreSQL 数据库中的函数列表及其参数?【英文标题】:How to get the list of functions in database in PostgreSQL along with its parameters? 【发布时间】:2014-06-04 09:20:40 【问题描述】:

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

【问题讨论】:

见***.com/q/1347282/398670 我看过那篇文章,但我无法获得我的函数的参数列表。 【参考方案1】:

有一个方便的功能可以帮助您: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。

【讨论】:

非常感谢克雷格。这对我帮助很大。 :) 授予...所有功能!甜蜜。【参考方案2】:

您应该使用pg_get_function_arguments(func_oid). Dynamic GRANT 必须在匿名代码块或函数中执行(将 my_schemamy_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 $$;

【讨论】:

啊,是的,这比oidvectortypes 更好用。 这也是一个不错的选择!

以上是关于如何获取 PostgreSQL 数据库中的函数列表及其参数?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 将每个项目添加到列表中 - 数据库函数

postgresql中带有临时表的存储函数

如何从 postgresql 视图表中获取要显示的对象列表

列出 PostgreSQL 模式中的表

如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列

我们如何在 PostgreSQL 中使用加密获取地理服务器中的原始数据