Localizando dependências em uma COLUNA ESPECÍFICA (maneira moderna, sem usar sysdepends)

13

Preciso encontrar todas as visualizações e procedimentos armazenados que consomem não apenas uma determinada tabela, mas uma coluna específica em uma tabela.

O seguinte "parece" funcionar, mas existem inúmeros avisos para ter cuidado com esse método (não confiável por vários motivos, que será preterido em breve, etc):

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

Algumas abordagens alternativas que são frequentemente referenciadas são sys.sql_dependencies e sys.sql_expression_dependencies, mas nenhuma delas possui granularidade no nível da coluna.

Alguém sabe uma maneira de fazer isso? (Ou mesmo se você souber definitivamente que isso literalmente não pode ser feito, seria útil saber.)

tbone
fonte
11
O exemplo 2 desta dica é para pesquisa no nível da coluna.

Respostas:

12

Aqui está um exemplo do AdventureWorks para exibir dependências de coluna.

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
fonte
Isso parece excelente. Você pode comentar se isso AT TOTAL ou POSSÍVEL sofre dos mesmos problemas "obsoletos e desatualizados" que o sysdepends? Veja: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone
TAMBÉM: Alguma idéia se isso resolveria dependências aninhadas? ou seja: um PROD depende de uma VIEW que depende de TABLE.COLUMN: se definirmos critérios em TABLE & COLUMN, a visualização e o processo serão exibidos nos resultados?
tbone
Só não entendo que finalidade é servida por wherecondição. O TS queria encontrar dependências na coluna específica. Eu acho que a condição deve restringir c.namee ed.referenced_id/ ed.referenced_entity_name, não deveria?
Pkuderov 29/09/19
Aqui em 2019 - sys.sql_dependenciesagora está no modo de manutenção, e a equipe da Microsoft recomenda apenas o uso sys.sql_expression_dependencies. Dito isto - não parece sys.sql_expression_dependenciescapturar o mesmo nível de detalhe.
10762409 diz Reinstate Monica