一尘不染

如何找到在哪里使用功能

sql

我有一个名为的函数func1。它在数据库中的某个地方使用,但我不知道在哪里。

我写了这个查询来帮助我找到它的使用位置:

select proname,prosrc
from pg_proc
where prosrc like '%func1%';

如何修改此查询以检查触发器是否也使用func1


阅读 117

收藏
2021-05-30

共1个答案

一尘不染

假设您知道它是一个触发函数(即RETURNS TRIGGER),则应这样做:

SELECT tgname, tgrelid::regclass
FROM pg_trigger
WHERE tgfoid = 'func1'::regproc

如果func1过载,则需要使用eg tgfoid = 'func1(text,text)'::regprocedure

但通常,它也可能会出现在pg_aggregate,或pg_cast,视图定义,检查约束或其他十几个地方,并且您不必全部检查它们。

您可以通过pg_depend跟踪此信息的底部,该信息跟踪数据库中的所有对象依赖项。例如:

SELECT classid::regclass
FROM pg_depend
WHERE refobjid = 'func1'::regproc

如果返回的是例如pg_attrdef,那么您知道它在列默认值中使用。中的其他字段pg_depend将准确告诉您它是哪个表/列。请注意,从另一个函数进行的调用不被视为依赖项,因此您仍然需要选中pg_proc.prosrc

但是,有一种更简单的方法来查找大多数依赖项:

BEGIN;
DROP FUNCTION func1();
ROLLBACK;

如果func1正在使用,DROP遗嘱(可能)会失败,并且错误会告诉您确切的位置。

如果您有一个方便的外壳程序,那就更容易了:只需运行一下pg_dump --schema-only,看看func1出现了什么。

2021-05-30