如何在SQL Server中查找引用系统表/函数的用户自定义对象
查找引用系统表/函数的用户自定义对象方案
你之前使用的sys.sql_dependencies、sys.dm_sql_referenced_entities这类依赖追踪视图,不会完整记录用户对象对系统级对象的引用关系,因此无法返回预期结果。最稳定的实现方式是直接扫描所有用户可编程对象的定义文本,匹配系统对象特征,具体SQL如下:
SELECT SCHEMA_NAME(o.schema_id) AS 对象所属架构, o.name AS 对象名, o.type_desc AS 对象类型, m.definition AS 对象完整定义 FROM sys.sql_modules m INNER JOIN sys.objects o ON m.object_id = o.object_id WHERE -- 过滤系统自带对象,只查用户自定义对象 o.is_ms_shipped = 0 -- 匹配引用sys架构或INFORMATION_SCHEMA架构的系统对象 AND ( m.definition LIKE N'%sys.%' OR m.definition LIKE N'%INFORMATION_SCHEMA.%' ) -- 可选:按对象类型过滤,比如只查存储过程和函数 -- AND o.type IN ('P', 'FN', 'IF', 'TF', 'V')
说明
- 对象类型说明:
P:存储过程FN/IF/TF:标量函数/表值函数V:视图TR:触发器
- 如果需要定位引用了特定系统对象的资源,可在WHERE条件中追加匹配规则,比如要找引用了
sys.objects的对象,添加AND m.definition LIKE N'%sys.objects%'即可 - 执行该查询需要持有当前数据库的
VIEW DEFINITION权限
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

