关于postgresql:如何查找所有用户定义的(不是扩展相关的)函数?

How to find all user-defined (not extension-related) functions?

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

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

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


正如@Craig所评论的,依赖关系存储在pg_catalog.pg_depend中。

查询可能如下所示(Postgres 11或更高版本):

1
2
3
4
5
6
7
8
9
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

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

DEPENDENCY_EXTENSION (e)

The dependent object is a member of the extension that is the
referenced object (see pg_extension). The dependent object can be
dropped only via DROP EXTENSION on the referenced object. Functionally
this dependency type acts the same as an internal dependency, but it's
kept separate for clarity and to simplify pg_dump.

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

f for a normal function, p for a procedure, a for an aggregate function, or w for a window function

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

1
2
3
4
SELECT ...
...
AND    NOT proisagg     -- no aggregate functions
AND    NOT proiswindow  -- no window functions

还没有程序。

在此处的手册中找到pg_get_function_identity_arguments()pg_get_functiondef()。 有关:

  • 如何获取函数参数列表(所以我可以删除一个函数)