Menemukan dependensi pada KOLOM KHUSUS (cara modern, tanpa menggunakan sysdepends)

13

Saya perlu menemukan semua tampilan & prosedur tersimpan yang mengkonsumsi tidak hanya tabel tertentu, tetapi kolom tertentu dalam tabel.

"Tampaknya" berikut ini berfungsi, tetapi ada banyak peringatan untuk berhati-hati dengan metode ini (tidak dapat diandalkan karena berbagai alasan, segera ditinggalkan, dll):

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

Beberapa pendekatan alternatif yang sering direferensikan adalah sys.sql_dependencies dan sys.sql_expression_dependencies, tetapi tidak satu pun dari ini memiliki granularity tingkat kolom.

Adakah yang tahu cara melakukan ini? (Atau bahkan jika Anda tahu secara pasti bahwa itu benar-benar tidak dapat dilakukan, akan sangat membantu untuk mengetahui.)

tulang T
sumber
1
Contoh 2 dari tip ini adalah untuk pencarian level kolom.

Jawaban:

12

Berikut adalah contoh AdventureWorks tentang melihat dependensi kolom.

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; 
Glen Swan
sumber
Ini terlihat sangat bagus. Bisakah Anda mengomentari apakah ini SEMUA atau MUNGKIN menderita masalah "basi, ketinggalan zaman" yang sama dengan masalah ketergantungan sistem? Lihat: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone
JUGA: Adakah yang tahu apakah ini akan menyelesaikan dependensi bersarang? yaitu: PROD tergantung pada VIEW yang bergantung pada TABLE.COLUMN: jika kita menetapkan kriteria pada TABLE & COLUMN, akankah tampilan dan proc ditampilkan di hasil?
Tulang
Saya hanya tidak mengerti apa tujuan dilayani oleh wherekondisi. TS ingin menemukan ketergantungan pada kolom tertentu. Saya pikir kondisinya harus membatasi c.namedan ed.referenced_id/ ed.referenced_entity_name, bukan?
pkuderov
Di sini pada tahun 2019 - sys.sql_dependenciessekarang dalam mode pemeliharaan, dan tim Microsoft merekomendasikan penggunaan saja sys.sql_expression_dependencies. Yang sedang dikatakan - itu tidak terlihat seperti sys.sql_expression_dependenciesmenangkap tingkat detail yang sama.
10762409 kata Reinstate Monica