Finden von Abhängigkeiten von einer SPEZIFISCHEN SPALTE (moderne Methode, ohne sysdepends zu verwenden)

13

Ich muss alle Ansichten und gespeicherten Prozeduren finden, die nicht nur eine bestimmte Tabelle, sondern eine bestimmte Spalte in einer Tabelle belegen.

Das Folgende "scheint" zu funktionieren, aber es gibt zahlreiche Warnungen, die bei dieser Methode zu beachten sind (aus verschiedenen Gründen nicht zuverlässig, bald veraltet usw.):

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

Einige alternative Ansätze, auf die häufig verwiesen wird, sind sys.sql_dependencies und sys.sql_expression_dependencies, aber keiner dieser Ansätze weist eine Granularität auf Spaltenebene auf.

Kennt jemand einen Weg, dies zu tun? (Oder selbst wenn Sie definitiv wissen, dass dies buchstäblich nicht möglich ist, wäre es hilfreich zu wissen.)

Knochen
quelle
1
Beispiel 2 dieses Tipps dient der Suche auf Spaltenebene.

Antworten:

12

Hier ist ein AdventureWorks-Beispiel zum Anzeigen von Spaltenabhängigkeiten.

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
quelle
Das sieht gut aus. Können Sie kommentieren, ob dies überhaupt oder möglicherweise unter denselben "veralteten, veralteten" Problemen leidet wie sysdepends? Siehe: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone
AUCH: Irgendeine Idee, ob dies verschachtelte Abhängigkeiten auflösen würde? dh: ein PROD hängt von einer ANSICHT ab, die von TABLE.COLUMN abhängt: Wenn wir Kriterien für TABLE & COLUMN festlegen, werden sowohl die Ansicht als auch der Prozess in den Ergebnissen angezeigt ?
Knochen
Ich verstehe einfach nicht, welchen Zweck die whereBedingung erfüllt. TS wollte Abhängigkeiten in der jeweiligen Spalte finden. Ich denke, die Bedingung sollte einschränken c.nameund ed.referenced_id/ ed.referenced_entity_nameoder nicht?
pkuderov
Hier im Jahr 2019 - sys.sql_dependenciesbefindet sich jetzt im Wartungsmodus und das Microsoft-Team empfiehlt die Verwendung nur sys.sql_expression_dependencies. Davon abgesehen sieht es nicht so aus, als würde es sys.sql_expression_dependenciesden gleichen Detaillierungsgrad erfassen.
10762409 sagt Reinstate Monica