获取所有程序的、用户定义的函数
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_functiondef
或pg_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 <> 'pg_catalog'
以排除pg_catalog
中定义的函数。用户可以在pg_proc
中定义函数(如果他们是超级用户或GRANT
拥有权限),但通常不会。
@CraigRinger, ErwinBrandstetter - 非常感谢以上是关于获取所有程序的、用户定义的函数的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?