Поиск зависимостей по СПЕЦИАЛЬНОЙ КОЛОННЕ (современный способ, без использования sysdepends)

14

Мне нужно найти все представления и хранимые процедуры, которые используют не только определенную таблицу, но определенный столбец в таблице.

Следующее «кажется» работает, но есть многочисленные предупреждения, чтобы быть осторожным с этим методом (ненадежным по разным причинам, скоро будет объявлен устаревшим и т. Д.):

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, но ни один из них не имеет гранулярности на уровне столбцов.

Кто-нибудь знает способ сделать это? (Или даже если вы точно знаете, что это буквально невозможно, было бы полезно знать.)

TBone
источник
1
Пример 2 этого совета предназначен для поиска на уровне столбцов.

Ответы:

13

Вот пример 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; 
Глен Свон
источник
Это выглядит отлично. Можете ли вы прокомментировать, страдает ли это ВСЕ или ВОЗМОЖНО от тех же «устаревших, устаревших» проблем, что и системная зависимость? См .: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone,
ТАКЖЕ: Есть идеи, если это разрешит вложенные зависимости? То есть: PROD зависит от VIEW, который зависит от TABLE.COLUMN: если мы установим критерии для TABLE & COLUMN, будут ли и представление, и процедура отображаться в результатах?
tbone
Я просто не понимаю, какой цели служит whereусловие. ТС хотел найти зависимости от конкретного столбца. Я думаю, что условие должно ограничивать c.nameи ed.referenced_id/ ed.referenced_entity_name, не так ли?
пкудеров
Здесь в 2019 году - sys.sql_dependenciesсейчас в режиме обслуживания, и команда Microsoft рекомендует использовать только sys.sql_expression_dependencies. Это сказанное - это не похоже, sys.sql_expression_dependenciesзахватывает тот же уровень детализации.
10762409 говорит восстановить Монику