如何找到正在使用的功能

时间:2015-06-17 14:51:41

标签: sql postgresql

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

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

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

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

2 个答案:

答案 0 :(得分:1)

假设你知道它是一个触发器功能(即RETURNS TRIGGER),这应该这样做:

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

如果func1超载,您需要使用例如tgfoid = 'func1(text,text)'::regprocedure

但一般情况下,它也可能出现在pg_aggregatepg_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;

如果使用func1DROP将(可能)失败,错误会告诉您确切位置。

更简单,如果你有一个方便的外壳:只需运行pg_dump --schema-only并查看func1出现的位置。

答案 1 :(得分:0)

select
    object_name(m.object_id) [object_name], m.definition
from
    sys.sql_modules m
where
    m.definition like N'%func1%'