有a similar question,但它含糊不清,接受的答案表明问题与我的略有不同。
如何查找不属于任何扩展程序(如PostGIS)的用户定义函数?链接问题的答案提供了一个返回大多数PostGIS函数的查询(噪音为我的目的),我不太清楚它是否足以改变它只返回我的函数(缺乏详细解释为什么它的工作方式和方式如何更改设置。)
现在我没有C函数,我的所有函数都在模式公共中 - 您可以使用这个事实,但要明确如何释放这些约束。如果确切的扩展列表很重要,那么现在假设只是PostGIS,但是如果从代码中不明显的话,可以解释如何将其他列表添加到列表中。
答案 0 :(得分:9)
正如@Craig所评论的,依赖关系存储在pg_catalog.pg_depend
。
查询可能如下所示( Postgres 11 或更高版本):
SELECT p.proname AS function_name
, pg_get_function_identity_arguments(p.oid) AS parameter_list
, pg_get_functiondef(p.oid) AS function_def -- CREATE FUNCTION statement
FROM pg_proc p
LEFT JOIN pg_depend d ON d.objid = p.oid
AND d.deptype = 'e' -- would depend on extension
WHERE p.pronamespace = 'public'::regnamespace -- your schema(s) of interest
AND d.objid IS NULL -- no such dependency
AND p.prokind = 'f'; -- only plain functions
这取决于所有功能,具体取决于结果的扩展名。 The manual关于依赖类型deptype = 'e'
:
DEPENDENCY_EXTENSION(e)
依赖对象是扩展名的成员 引用对象(见
pg_extension
)。依赖对象可以是 仅在引用的对象上通过DROP EXTENSION
删除。功能 这种依赖类型与内部依赖类似,但它是一样的 为了清晰起见而保持分离并简化pg_dump。
p.prokind = 'f'
将结果限制为普通函数。 The manual:
f
表示正常函数,p
表示过程,a
表示聚合函数,w
表示函数
Postgres 11中的新内容。对于 Postgres 10或更早版本使用:
SELECT ...
...
AND NOT proisagg -- no aggregate functions
AND NOT proiswindow -- no window functions
还没有程序。
查找pg_get_function_identity_arguments()
和pg_get_functiondef()
in the manual here。相关: