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

时间:2014-08-19 15:20:20

标签: function postgresql

a similar question,但它含糊不清,接受的答案表明问题与我的略有不同。

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

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

1 个答案:

答案 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。相关: