有没有办法在 SQL Server 2008 数据库中查找对表列的所有引用?我需要知道该列是从哪些其他表或存储过程或视图中引用的。
4 回答
如果您需要按名称查找数据库对象(例如表、列、触发器) - 请查看名为SQL Search的免费Red-Gate 工具,它会在您的整个数据库中搜索任何类型的字符串。
对于任何 DBA 或数据库开发人员来说,它都是一个很棒的必备工具——我是否已经提到它完全免费用于任何用途?
当我需要分析由于表架构更改造成的影响时,我使用以下步骤进行分析。这可能不完整但很有帮助!
- Sp_help [TableName] :这有助于我找到所有 FOREIGN KEY 约束参考。我还可以找到将此表作为 FOREIGN Key 引用的任何其他表。
- Sp_depends [TableName]:这有助于使用该表查找过程、函数和视图。
- 蛮力方法:我使用不同的系统表和函数来检查 SQL 作业、模块等中的特定关键字
仅供参考:Sp_help [TableName] Sp_depends [TableName]
select top 10 * from msdb.dbo.sysjobsteps where command like '%%'
SELECT top 10 Name, OBJECT_DEFINITION(OBJECT_ID)
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%%'
SELECT top 10 OBJECT_NAME(object_id), *
FROM sys.sql_modules
WHERE definition LIKE '%%'
您可以尝试使用ApexSQL Search等工具。它搜索对象名称,但它也搜索依赖对象的列表,即使依赖表/视图中的列名称不同。
其他解决方案是使用系统视图和/或系统功能来获取您需要的数据。建议是用来sys.foreign_keys, sys.objects, sys.all_columns
获取你需要的数据。
我花了很多时间试图找到一种快速识别列级别依赖项的方法,而无需搜索文本或使用第三方应用程序。另一个挑战是跨多个数据库查找表名可能重复的依赖关系,这会在搜索 SP 文本时导致误报。
从 SQL 2008 开始,有一个函数可以在字段级别返回跨数据库的依赖关系。
下面的代码有一些例外情况:
- 如果在已删除的表/字段上存在具有无效引用的存储过程,它将失败(顺便说一下,我发现这对于查找被表修改意外破坏的 SP 很有用)。
- 在 SP 以不寻常的方式使用临时表的情况下,它不会找到所有依赖项。
- 在某些情况下,我发现它为复杂的存储过程返回了误报。
此代码应从 SP 所在的数据库中运行,以便能够跨越其他数据库依赖项。
SELECT
--SP, View, or Function
ReferencingName = o.name,
ReferencingType = o.type_desc,
--Referenced Field
ref.referenced_database_name, --will be null if the DB is not explicitly called out
ref.referenced_schema_name, --will be null or blank if the DB is not explicitly called out
ref.referenced_entity_name,
ref.referenced_minor_name,
--this will tell you the reference type
ref.is_selected,
ref.is_updated
FROM sys.objects AS o
cross apply sys.dm_sql_referenced_entities('dbo.' + o.name, 'Object') ref
where o.type in ('FN','IF','V','P','TF')