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.)


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; 

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.