【问题标题】:How to find all user-defined (not extension-related) functions?如何找到所有用户定义的(非扩展相关的)函数?
【发布时间】:2014-08-19 15:20:20
【问题描述】:

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

如何查找不属于 PostGIS 等任何扩展的用户定义函数?链接问题的答案提供了一个查询,该查询返回了大多数 PostGIS 函数(我的目的是噪音),我对它的理解不够好,无法将其更改为仅返回我的函数(缺乏详细解释为什么它以这种方式工作以及如何工作更改设置)。

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

【问题讨论】:

  • 如果您将扩展安装在单独的架构中,您只能将您的功能与由扩展创建的功能区分开来。否则我认为没有办法区分
  • @a_horse_with_no_name 必须有 - 因为DROP EXTENSION 有效,并且扩展不必提供卸载 SQL 文件。我没有特别检查,但我会说它会在pg_depend
  • @a_horse_with_no_name ...是的。例如select e.oid, e.extname, d.* from pg_extension e inner join pg_depend d on d.refclassid = 'pg_extension'::regclass and d.refobjid = e.oid;
  • @CraigRinger:啊,谢谢。很高兴知道。

标签: function postgresql


【解决方案1】:

正如@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。相关:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多