Encontrar dependencias en una COLUMNA ESPECÍFICA (forma moderna, sin usar sysdepends)


13

Necesito encontrar todas las vistas y procedimientos almacenados que consuman no solo una tabla determinada, sino una columna específica en una tabla.

Lo siguiente "parece" funcionar, pero hay numerosas advertencias para tener cuidado con este método (no confiable por una variedad de razones, que pronto será obsoleto, 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

Algunos enfoques alternativos a los que a menudo se hace referencia son sys.sql_dependencies y sys.sql_expression_dependencies, pero ninguno de estos tiene granularidad a nivel de columna.

¿Alguien sabe una manera de hacer esto? (O incluso si sabe definitivamente que literalmente no se puede hacer, sería útil saberlo).


1
El ejemplo 2 de este consejo es para la búsqueda a nivel de columna.

Respuestas:


12

Aquí hay un ejemplo de AdventureWorks sobre la visualización de dependencias de columna.

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; 

Esto se ve excelente. ¿Puede comentar si esto en absoluto o POSIBLEMENTE sufre los mismos problemas "obsoletos, desactualizados" que sysdepends? Ver: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone

TAMBIÉN: ¿Alguna idea de si esto resolvería dependencias anidadas? es decir: un PROD depende de una VISTA que depende de TABLE.COLUMN: si establecemos criterios en TABLE & COLUMN, ¿se mostrarán tanto la vista como el proceso en los resultados?
tbone

Simplemente no entiendo para qué sirve la wherecondición. TS quería encontrar dependencias en la columna específica. Creo que la condición debería restringir c.namey ed.referenced_id/ ed.referenced_entity_name, ¿no debería?
pkuderov

Aquí en 2019: sys.sql_dependenciesahora está en modo de mantenimiento, y el equipo de Microsoft recomienda usar solo sys.sql_expression_dependencies. Dicho esto, no parece que sys.sql_expression_dependenciescapture el mismo nivel de detalle.
10762409 dice Reinstate Monica
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.