Sql 如何找到正在使用函数的位置
我有一个名为Sql 如何找到正在使用函数的位置,sql,postgresql,Sql,Postgresql,我有一个名为func1的函数。它被用在数据库的某个地方,但我不知道在哪里 我编写此查询是为了帮助我找到它的使用位置: select proname,prosrc from pg_proc where prosrc like '%func1%'; 如何修改此查询以检查触发器是否也使用了func1?假设您知道它是一个触发器函数(即返回触发器),则应执行以下操作: SELECT tgname, tgrelid::regclass FROM pg_trigger WHERE tgfoid = 'fun
func1
的函数。它被用在数据库的某个地方,但我不知道在哪里
我编写此查询是为了帮助我找到它的使用位置:
select proname,prosrc
from pg_proc
where prosrc like '%func1%';
如何修改此查询以检查触发器是否也使用了
func1
?假设您知道它是一个触发器函数(即返回触发器
),则应执行以下操作:
SELECT tgname, tgrelid::regclass
FROM pg_trigger
WHERE tgfoid = 'func1'::regproc
如果重载了func1
,则需要使用例如tgfoid='func1(text,text)'::regprocedure
但一般来说,它也可能出现在pg_aggregate
、或pg_cast
、视图定义、检查约束或十几个其他位置,您不需要全部检查它们
您可以通过跟踪数据库中的所有对象依赖关系来了解这一点。例如:
SELECT classid::regclass
FROM pg_depend
WHERE refobjid = 'func1'::regproc
如果返回例如,那么您知道它在默认列中使用。pg_depend
中的其他字段将准确地告诉您它是哪个表/列。请注意,来自另一个函数的调用不被视为依赖项,因此您仍然需要检查pg_proc.prosrc
但有一种更简单的方法可以追踪大多数依赖项:
BEGIN;
DROP FUNCTION func1();
ROLLBACK;
如果正在使用func1
,则下拉操作可能会失败,错误会告诉您具体位置
如果您手头有一个shell,就更容易了:只需运行pg_dump--schema only
并查看func1
出现的位置
select
object_name(m.object_id) [object_name], m.definition
from
sys.sql_modules m
where
m.definition like N'%func1%'
选择
对象名称(m.object\u id)[对象名称],m.definition
从…起
sys.sql_模块m
哪里
m、 定义类似于N“%1%”
我想到了更多类似于在所有触发器文本代码中搜索单词“func1”的内容。和我在函数上做的一样。。。prosrc是函数的代码。所以我在代码中搜索func1@John:Postgres不存储触发器定义的文本形式。它解析它,并将每个组件放入pg\u trigger
的相应字段中。函数名替换为函数的内部标识符,并存储在pg_触发器中。tgfoid
LIKE
区分大小写。您可能希望使用ILIKE
。请添加一些有关您的解决方案的信息,说明为什么以及如何解决问题?