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.)


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; 

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.