如何查找所有用户定义的(不是与扩展相关的)功能?

Pav*_* V. 8 postgresql function

一个类似的问题,但它是模棱两可的,并且接受的答案表明这个问题与我的略有不同.

如何查找不属于任何扩展程序(如PostGIS)的用户定义函数?链接问题的答案提供了一个返回大多数PostGIS函数的查询(噪音为我的目的),我不太清楚它是否足以改变它只返回我的函数(缺乏详细解释为什么它的工作方式和方式如何更改设置).

现在我没有C函数,我的所有函数都在模式公共中 - 您可以使用这个事实,但要明确如何释放这些约束.如果确切的扩展列表很重要,那么现在假设只是PostGIS,但是如果从代码中不明显的话,可以解释如何将其他列表添加到列表中.

Erw*_*ter 11

正如@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
Run Code Online (Sandbox Code Playgroud)

这取决于所有功能,具体取决于结果的扩展名.关于依赖类型的手册deptype = 'e':

DEPENDENCY_EXTENSION(e)

依赖对象是作为引用对象的扩展的成员(请参阅参考资料pg_extension).依赖对象只能通过DROP EXTENSION引用的对象删除.从功能上讲,这种依赖类型与内部依赖项的作用相同,但为了清晰起见,它保持独立并简化了pg_dump.

并将p.prokind = 'f'结果限制为普通函数.手册:

f用于正常函数,p用于过程,a用于聚合函数或w用于窗口函数

这是Postgres 11中的新功能.对于Postgres 10或更早版本使用:

SELECT ...
...
AND    NOT proisagg     -- no aggregate functions
AND    NOT proiswindow  -- no window functions
Run Code Online (Sandbox Code Playgroud)

还没有程序.

在这里找到pg_get_function_identity_arguments()pg_get_functiondef() 在手册中.有关: