Znajdowanie zależności od SZCZEGÓLNEJ KOLUMNY (nowoczesny sposób, bez użycia sysdepends)


14

Muszę znaleźć wszystkie widoki i procedury składowane, które zużywają nie tylko określoną tabelę, ale określoną kolumnę w tabeli.

Następujące „wydaje się” działać, ale istnieje wiele ostrzeżeń, aby zachować ostrożność przy tej metodzie (nie są wiarygodne z różnych powodów, wkrótce będą przestarzałe itp.):

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

Niektóre alternatywne podejścia, do których często się odwołuje, to sys.sql_dependencies i sys.sql_expression_dependencies, ale żadne z nich nie ma ziarnistości na poziomie kolumny.

Czy ktoś wie, jak to zrobić? (Lub nawet jeśli definitywnie wiesz, że dosłownie nie można tego zrobić, dobrze byłoby wiedzieć).


1
Przykład 2 tej wskazówki dotyczy wyszukiwania na poziomie kolumny.

Odpowiedzi:


13

Oto przykład AdventureWorks dotyczący wyświetlania zależności między kolumnami.

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; 

To wygląda doskonale. Czy możesz skomentować, czy to WSZYSTKO lub MOŻLIWE cierpi z powodu tych samych problemów „przestarzałych, nieaktualnych”, jak sysdepends? Zobacz: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone

RÓWNIEŻ: Masz pomysł, czy to rozwiąże zagnieżdżone zależności? tj .: PROD zależy od WIDOKU, który zależy od TABELI. KOLUMNA: jeśli ustawimy kryteria dla TABELI i KOLUMNY, to czy widok i proces pokażą się w wynikach?
tbone

Po prostu nie rozumiem, jaki cel spełnia wherewarunek. TS chciał znaleźć zależności od konkretnej kolumny. Myślę, że warunek powinien być ograniczony c.namei ed.referenced_id/ ed.referenced_entity_namenie, prawda?
pkuderov

Tutaj w 2019 roku - sys.sql_dependenciesjest teraz w trybie konserwacji, a zespół Microsoft zaleca używanie tylko sys.sql_expression_dependencies. To powiedziawszy - nie wygląda to na sys.sql_expression_dependenciesuchwycenie tego samego poziomu szczegółowości.
10762409 mówi Przywróć Monikę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.