Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何找到正在使用函数的位置_Sql_Postgresql - Fatal编程技术网

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
。请添加一些有关您的解决方案的信息,说明为什么以及如何解决问题?