我有一个名为的函数func1。它在数据库中的某个地方使用,但我不知道在哪里。
func1
我写了这个查询来帮助我找到它的使用位置:
select proname,prosrc from pg_proc where prosrc like '%func1%';
如何修改此查询以检查触发器是否也使用func1?
假设您知道它是一个触发函数(即RETURNS TRIGGER),则应这样做:
RETURNS TRIGGER
SELECT tgname, tgrelid::regclass FROM pg_trigger WHERE tgfoid = 'func1'::regproc
如果func1过载,则需要使用eg tgfoid = 'func1(text,text)'::regprocedure。
tgfoid = 'func1(text,text)'::regprocedure
但通常,它也可能会出现在pg_aggregate,或pg_cast,视图定义,检查约束或其他十几个地方,并且您不必全部检查它们。
pg_aggregate
pg_cast
您可以通过pg_depend跟踪此信息的底部,该信息跟踪数据库中的所有对象依赖项。例如:
pg_depend
SELECT classid::regclass FROM pg_depend WHERE refobjid = 'func1'::regproc
如果返回的是例如pg_attrdef,那么您知道它在列默认值中使用。中的其他字段pg_depend将准确告诉您它是哪个表/列。请注意,从另一个函数进行的调用不被视为依赖项,因此您仍然需要选中pg_proc.prosrc。
pg_attrdef
pg_proc.prosrc
但是,有一种更简单的方法来查找大多数依赖项:
BEGIN; DROP FUNCTION func1(); ROLLBACK;
如果func1正在使用,DROP遗嘱(可能)会失败,并且错误会告诉您确切的位置。
DROP
如果您有一个方便的外壳程序,那就更容易了:只需运行一下pg_dump --schema-only,看看func1出现了什么。
pg_dump --schema-only