我有一个名为func1
的函数。它在数据库中的某个地方使用,但我不知道在哪里。
我写了这个查询来帮助我找到它的使用位置:
select proname,prosrc
from pg_proc
where prosrc like '%func1%';
如何修改此查询以检查触发器是否也使用func1
?
答案 0 :(得分:1)
假设你知道它是一个触发器功能(即RETURNS TRIGGER
),这应该这样做:
SELECT tgname, tgrelid::regclass
FROM pg_trigger
WHERE tgfoid = 'func1'::regproc
如果func1
超载,您需要使用例如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
出现的位置。
答案 1 :(得分:0)
select object_name(m.object_id) [object_name], m.definition from sys.sql_modules m where m.definition like N'%func1%'