特定の列への依存関係の検索(sysdependsを使用しない現代的な方法)


13

特定のテーブルだけでなく、テーブル内の特定の列を使用するすべてのビューとストアドプロシージャを見つける必要があります。

次のように機能すると思われますが、この方法を使用する場合は注意が必要な警告が多数あります(さまざまな理由で信頼性が低く、すぐに非推奨になるなど)。

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は、列レベルの検索用です。

回答:


12

以下は、列の依存関係の表示に関する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; 

これは素晴らしいですね。このAT ALLまたはPOSSIBLYのどちらがsysdependsと同じ「古く、時代遅れ」の問題を抱えているかについてコメントできますか?参照:sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/...
tbone

また、これがネストされた依存関係を解決するかどうかはわかりますか?つまり、PRODはTABLE.COLUMNに依存するVIEWに依存します。TABLE&COLUMNに基準を設定すると、ビュープロシージャの両方が結果に表示されますか?
tbone

where条件によってどのような目的が果たされるのか理解できません。TSは特定の列の依存関係を見つけたかったのです。条件は制約c.nameed.referenced_id/ ed.referenced_entity_nameであると思いますが、そうではありませんか?
pkuderov 2017

ここ2019年- sys.sql_dependenciesは現在メンテナンスモードになっており、Microsoftチームはのみの使用を推奨していsys.sql_expression_dependenciesます。とはいえsys.sql_expression_dependencies、同じレベルの詳細をキャプチャしたようには見えません。
10762409は、モニカを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.