如何获取 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_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 $$;
【讨论】:
啊,是的,这比oidvectortypes
更好用。
这也是一个不错的选择!以上是关于如何获取 PostgreSQL 数据库中的函数列表及其参数?的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 将每个项目添加到列表中 - 数据库函数