列出引用 PostgreSQL 中表的存储函数

Posted

技术标签:

【中文标题】列出引用 PostgreSQL 中表的存储函数【英文标题】:List stored functions that reference a table in PostgreSQL 【发布时间】:2010-12-06 06:02:29 【问题描述】:

只是一个简单的问题:在 PostgreSQL 中,如果可能的话,如何使用仅使用 SELECT 语句的表列出所有存储函数/存储过程的名称?如果一个简单的 SELECT 不够用,我可以使用存储函数。

我认为,我的问题与其他问题有些相似,但其他问题适用于 SQL Server 2005:List of Stored Procedure from Table

(可选)关于这个问题,你如何同时列出以相同方式使用同一张表的触发器和约束?

【问题讨论】:

List stored functions using a table in PostgreSQL 【参考方案1】:

请更改以下查询中的 schema_name 和 table_name:

SELECT n.nspname AS schema_name
     , p.proname AS function_name
     , pg_get_function_arguments(p.oid) AS args
     , pg_get_functiondef(p.oid) AS func_def
FROM   pg_proc p
JOIN   pg_namespace n ON n.oid = p.pronamespace
AND    n.nspname = 'schema_name'
AND    p.prosrc like '%table_name%'

由于表名区分大小写,所以需要定义准确的表名。

【讨论】:

请注意,PostgreSQL 确实有 ILIKE 关键字和 ~~* 运算符,它们都可以用于不区分大小写的匹配。【参考方案2】:
SELECT  p.proname
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      p.pronamespace = n.oid
WHERE   n.nspname = 'public';

【讨论】:

正如 Lukáš Lalinský 在他的回答中指出的那样,PostgreSQL 支持标准 information_schema.routines——对所有喜欢标准的东西都很有用。【参考方案3】:

用于检索函数的 参数类型,这是在 ALTER 中引用函数时所必需的——使用 oldevectortypes 对我来说效果很好.

见How can I get a list of all functions stored in the database of a particular schema in PostgreSQL?

【讨论】:

【参考方案4】:

看看我的recipe。它读取函数和触发器。它基于来自:Extracting META information from PostgreSQL (INFORMATION_SCHEMA)

的信息

【讨论】:

谢谢,这行得通。结合 SELECT pg_catalog.pg_get_functiondef('functionName'::regproc) 你也可以得到 create 语句。 Extracting META... 链接对我有用,我直到现在才看到“recipe”链接。 第二个链接失效。 :-( 请将第一个链接的内容合并到这个答案中,这样当那个人死时我们就不会被蒙在鼓里。谢谢。【参考方案5】:

如果你使用 psql,试试\df

来自手册页:

Tip
To look up functions taking arguments or returning values of a specific type, use your pager's search capability to scroll through the \df output.

运行\set ECHO_HIDDEN 将揭示\df 在幕后运行的内容。

【讨论】:

【参考方案6】:

与@quassnoi 和@davidwhthomas 相同,只是我在其中添加了参数名称:

SELECT  proname, proargnames, prosrc 
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      pronamespace = n.oid
WHERE   nspname = 'public';

如果列出函数的目的是清理它们或使用不断变化的参数列表迭代新函数,您将经常需要删除函数:

DROP FUNCTION <name>(<args>);

通过添加 proargnames,我可以为 drop 构造适用的函数名称。

此外,很高兴在评估函数时看到更完整的画面。

【讨论】:

【参考方案7】:
SELECT  proname, prosrc
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      pronamespace = n.oid
WHERE   nspname = 'public';

【讨论】:

也许下次简单地编辑你自己上面的帖子而不是改变一个小东西 Daniel L. VanDenBosch:他的全部业力都来自这个答案的支持,所以我认为他不会很快这样做。【参考方案8】:

您可以使用标准的information_schema 架构来获取有关您的数据库的元数据(它在 SQL 标准中,因此在不同的数据库系统中应该以相同的方式工作)。在这种情况下,您需要information_schema.routines

【讨论】:

有用,但不能真正回答问题。【参考方案9】:

不包括系统的东西:

select proname from pg_proc where proowner <> 1;

【讨论】:

为什么是 1?在我的 Postgresql 安装中,系统过程的 proowner 是 10,而不是 1。 我不知道。解决方案当然是相应地更改“1”。

以上是关于列出引用 PostgreSQL 中表的存储函数的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 中系统表 pg_attribute 膨胀现象

存储过程/存储函数:PostgreSQL 中的 SELECT

Release Candidate 在 Maven 存储库中表现得像 SNAPSHOT

PostgreSQL 存储过程/函数

postgresql中带有临时表的存储函数

PostgreSQL从存储函数访问多个数据库