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.