gpt4 book ai didi

sql - 如何找到正在使用函数的位置

转载 作者:行者123 更新时间:2023-11-29 13:27:39 25 4
gpt4 key购买 nike

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

我编写此查询是为了帮助我找到它的使用位置:

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

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

最佳答案

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

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

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

但一般来说,它也可能出现在 pg_aggregatepg_cast 中,或出现在 View 定义中,或检查约束中,或其他许多地方,而你不想检查所有内容。

您可以通过 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 将(可能)失败,错误会告诉您确切位置。

如果您手边有一个 shell,那就更简单了:只需运行 pg_dump --schema-only 并查看 func1 出现的位置。

关于sql - 如何找到正在使用函数的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30895124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com