查找对特定列的依赖关系(现代方式,不使用sysdepends)


14

我需要查找所有不仅消耗特定表,而且消耗表中特定列的视图和存储过程。

以下“似乎”可以正常工作,但是使用此方法时要注意许多警告(由于各种原因不可靠,即将被弃用,等等):

SELECT object_name(so.id) TableName, sc.name ColumnName, OBJECT_NAME(sd.id) DependentObjectName,
(SELECT xtype FROM sysobjects so WHERE so.id = sd.id) Object_Type
FROM sysobjects so INNER JOIN syscolumns sc
ON so.id = sc.id
INNER JOIN sysdepends sd
ON so.id = sd.depid and sc.colid = sd.depnumber
WHERE 
    object_name(so.id) = 'MyTableName'
AND sc.name = 'MyColumnName'
order by object_name(so.id), Object_Type

经常引用的一些替代方法是sys.sql_dependencies和sys.sql_expression_dependencies,但是这些方法都不具有列级粒度。

有人知道这样做的方法吗?(或者,即使您确定地知道它实际上无法完成,了解它也会很有帮助。)


1
本技巧的示例2用于列级搜索。

Answers:


13

这是一个有关查看列依赖性的AdventureWorks示例。

SELECT ReferencingObject = SCHEMA_NAME(o1.schema_id) + '.' + o1.name,
       ReferencedObject = SCHEMA_NAME(o2.schema_id) + '.'
                          + ed.referenced_entity_name,
       ColumnName = c.name,
       ReferencedObjectType = o2.type,
       ReferencingObjecType = o1.type
FROM   AdventureWorks2012.sys.sql_expression_dependencies ed
       INNER JOIN AdventureWorks2012.sys.objects o1
               ON ed.referencing_id = o1.object_id
       INNER JOIN AdventureWorks2012.sys.objects o2
               ON ed.referenced_id = o2.object_id
       INNER JOIN AdventureWorks2012.sys.sql_dependencies d
               ON ed.referencing_id = d.object_id
                  AND d.referenced_major_id = ed.referenced_id
       INNER JOIN sys.columns c
               ON c.object_id = ed.referenced_id
                  AND d.referenced_minor_id = c.column_id
WHERE  SCHEMA_NAME(o1.schema_id) + '.' + o1.name = 'HumanResources.vEmployee' AND c.name = 'JobTitle'
ORDER  BY ReferencedObject,
          c.column_id; 

这看起来很棒。您能否评论一下这是完全还是可能遭受与sysdepends相同的“陈旧,过时”问题?请参阅:sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/...
TBONE

还:可以解决嵌套的依赖关系吗?即:PROD依赖于VIEW,而VIEW则依赖于TABLE.COLUMN:如果我们在TABLE&COLUMN上设置标准,则视图 proc 都将显示在结果中吗?
tbone 2014年

我只是不明白where条件达到了什么目的。TS希望在特定列中找到依据。我认为条件应该约束c.nameed.referenced_id/ ed.referenced_entity_name,不是吗?
pkuderov

在2019年- sys.sql_dependencies现在处于维护模式,Microsoft团队建议仅使用sys.sql_expression_dependencies。话虽这么说-看起来并没有sys.sql_expression_dependencies捕捉到相同水平的细节。
10762409说,恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.