获取所有程序的、用户定义的函数

Posted

技术标签:

【中文标题】获取所有程序的、用户定义的函数【英文标题】:Get all procedural , user defined functions 【发布时间】:2013-05-19 06:43:46 【问题描述】:

如何通过SQL查询获取所有用户定义函数的列表?


我找到了这个代码here

SELECT p.proname, p.pronargs, t.typname
 FROM pg_proc p, pg_language l, pg_type t
 WHERE p.prolang = l.oid
 and p.prorettype = t.oid
 and l.lanname = 'c'
ORDER BY proname;

但这会得到 C 函数

如何获得用户定义的程序语言函数,例如用plpgsql 语言编写的?

【问题讨论】:

【参考方案1】:

考虑:

select 
    pp.proname,
    pl.lanname,
    pn.nspname,
    pg_get_functiondef(pp.oid)
from pg_proc pp
inner join pg_namespace pn on (pp.pronamespace = pn.oid)
inner join pg_language pl on (pp.prolang = pl.oid)
where pl.lanname NOT IN ('c','internal') 
  and pn.nspname NOT LIKE 'pg_%'
  and pn.nspname <> 'information_schema';

另请参阅:What is the command to find script of a existing function in postgresql?

直接使用pg_get_functiondefpg_proc 中的prosrc 列。关键思想是加入 pg_namespace 并过滤掉 PostgreSQL 目录函数,这可能足以满足大多数目的:

FROM pg_proc pp INNER JOIN pg_namespace ON (pp.pronamespace = pn.oid)
WHERE pn.nspname <> 'pg_catalog'

获取用户定义函数的源代码的麻烦在于确定用户的含义。可以创建多种类型的函数:

函数使用CREATE EXTENSION。 PostgreSQL 创建的函数。 由管理员编译和安装的函数。

拥有足够授权的超级用户可以在pg_proc 中定义函数,但通常不会。

由于只有超级用户可以创建 C 语言函数,所以排除它们。这些功能可以由管理员自定义安装在特定数据库上,但不是普通用户。

【讨论】:

谢谢,使用这个查询SELECT proname,pg_get_functiondef(oid) FROM pg_proc 我们得到所有函数名称(和定义代码)对吗?以及如何仅获取从用户创建的功能,where 子句中有一些条件? @OTARIKI 如果我理解正确,您只需要 用户定义 功能。那里的麻烦在于确定“用户”的含义。 CREATE EXTENSION 添加的功能是用户定义的吗?我建议做的是FROM pg_proc pp INNER JOIN pg_namespace ON (pp.pronamespace = pn.oid) 然后过滤WHERE pn.nspname &lt;&gt; 'pg_catalog' 以排除pg_catalog 中定义的函数。用户可以pg_proc 中定义函数(如果他们是超级用户或GRANT 拥有权限),但通常不会。 @CraigRinger, ErwinBrandstetter - 非常感谢

以上是关于获取所有程序的、用户定义的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?

编程中系统允许对库函数重新定义吗?

如何从自定义凭据提供程序中的更改密码场景中获取新密码

For循环不考虑所有项目?

Snowflake 中是不是有办法允许用户在程序上获取 ddl 但没有使用或所有权权限?

核查清单-小程序分享功能