考虑:
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';
另请参阅:在 postgresql 中查找现有函数的脚本的命令是什么?
直接使用pg_get_functiondef
或从prosrc
列pg_proc
。关键思想是加入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 语言函数,所以排除它们。管理员可以在特定数据库上自定义安装此类功能,但普通用户不能。