Пошук залежностей від СПЕЦИФІЧНОЇ КОЛИНИ (сучасний спосіб, без використання 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_dependitions та sys.sql_expression_dependitions, але жоден з них не має деталізації рівня стовпців.

Хтось знає спосіб цього зробити? (Або навіть якщо ви остаточно знаєте, що це буквально неможливо зробити, було б корисно знати.)


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; 

Це виглядає чудово. Чи можете ви прокоментувати, чи це ВСЕ або МОЖЛИВО страждає від тих самих "застарілих, застарілих" питань, що і sysdepends? Дивіться: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone

ТАКОЖ: Будь-яка ідея, чи це дозволить вирішити вкладені залежності? тобто: PROD залежить від ПОГЛЯДУ, який залежить від TABLE.COLUMN: якщо ми встановимо критерії TABLE & COLUMN, чи відображатимуться як результат, так і proc у результатах?
tbone

Я просто не розумію, якій цілі служить whereумова. TS хотів знайти залежності від конкретного стовпця. Я думаю, що умова повинна обмежувати c.nameта ed.referenced_id/ ed.referenced_entity_nameчи не так?
pkuderov

Ось у 2019 році - sys.sql_dependenciesзараз у режимі обслуговування, і команда Microsoft рекомендує використовувати лише sys.sql_expression_dependencies. Це, мабуть, не схоже на sys.sql_expression_dependenciesтой самий рівень деталізації.
10762409 повідомляє Відновити Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.