介绍:
具有数百个存储功能的 PostgreSQL 数据库,包括过时的、未使用的等。
问题
我需要找出与表 X 有任何关系的所有存储函数——因为我想更改表结构。其中一些可能没有使用,所以我不能仅仅通过查看代码来做到这一点。
我有 ATM 的解决方案是运行 psql\df+
和 grepping 输出,但我更喜欢类似数据库的解决方案,即使用信息模式。这肯定是一项重复性的任务,我希望它干净整洁。
有什么建议么?
介绍:
具有数百个存储功能的 PostgreSQL 数据库,包括过时的、未使用的等。
问题
我需要找出与表 X 有任何关系的所有存储函数——因为我想更改表结构。其中一些可能没有使用,所以我不能仅仅通过查看代码来做到这一点。
我有 ATM 的解决方案是运行 psql\df+
和 grepping 输出,但我更喜欢类似数据库的解决方案,即使用信息模式。这肯定是一项重复性的任务,我希望它干净整洁。
有什么建议么?
函数的主体只是存储为string。没有引用对象的列表。(这与视图不同,例如,其中保存了引用表的实际链接。)
此Postgres 10 或更早版本的查询使用系统目录信息函数
pg_get_functiondef()
来重构CREATE FUNCTION
相关函数的脚本,并使用不区分大小写的正则表达式搜索表名:它应该可以完成这项工作,但它显然不是防弹的。对于动态生成表名的动态 SQL,它可能会失败,并且它可以返回任意数量的误报 - 特别是如果表名是一个常用词。
不包括来自系统模式的聚合函数和所有函数。
\m
并\M
在正则表达式中标记单词的开头和结尾。pg_proc
Postgres 11 中更改的系统目录proisagg
被替换为prokind
,添加了真正的存储过程。你需要适应。有关的:这个查询很容易使用: