Trovare dipendenze su una COLONNA SPECIFICA (modo moderno, senza usare sysdepends)


13

Devo trovare tutte le viste e le procedure memorizzate che consumano non solo una determinata tabella, ma una colonna specifica in una tabella.

Il seguente "sembra" funzionare, ma ci sono numerosi avvertimenti per stare attenti a questo metodo (non affidabile per una varietà di motivi, che presto sarà deprecato, ecc.):

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

Alcuni approcci alternativi a cui viene spesso fatto riferimento sono sys.sql_dependencies e sys.sql_expression_dependencies, ma nessuno di questi presenta una granularità a livello di colonna.

Qualcuno conosce un modo per farlo? (O anche se sai definitivamente che non si può fare letteralmente, sarebbe utile saperlo.)


1
L'esempio 2 di questo suggerimento è per la ricerca a livello di colonna.

Risposte:


12

Ecco un esempio di AdventureWorks sulla visualizzazione delle dipendenze delle colonne.

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; 

Questo sembra eccellente. Puoi commentare se questo ALL ALL o POSSIBLY soffre degli stessi problemi "obsoleti, obsoleti" di sysdepends? Vedi: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
— tbone

ANCHE: Qualche idea se questo risolverebbe le dipendenze nidificate? vale a dire: un PROD dipende da una VISTA che dipende da TABLE.COLUMN: se impostiamo i criteri su TABLE & COLUMN, sia la vista che il proc mostreranno nei risultati?
— tbone,

Non capisco quale sia lo scopo della wherecondizione. TS voleva trovare dipendenze sulla colonna specifica. Penso che la condizione dovrebbe limitare c.namee ed.referenced_id/ ed.referenced_entity_name, non dovrebbe?
— pkuderov,

Qui nel 2019 - sys.sql_dependenciesè ora in modalità manutenzione e il team di Microsoft consiglia di utilizzare solo sys.sql_expression_dependencies. Detto questo, non sembra sys.sql_expression_dependenciescatturare lo stesso livello di dettaglio.
— 10762409 dice Reinstate Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.