Recherche de dépendances sur une COLONNE SPÉCIFIQUE (méthode moderne, sans utiliser sysdepends)

13

J'ai besoin de trouver toutes les vues et procédures stockées qui consomment non seulement une certaine table, mais une colonne spécifique dans une table.

Les éléments suivants "semblent" fonctionner, mais il existe de nombreux avertissements pour être prudent avec cette méthode (non fiable pour diverses raisons, bientôt obsolète, 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

Certaines approches alternatives qui sont souvent référencées sont sys.sql_dependencies et sys.sql_expression_dependencies, mais aucune d'entre elles n'a une granularité au niveau des colonnes.

Quelqu'un connaît-il une façon de procéder? (Ou même si vous savez définitivement que cela ne peut littéralement pas être fait, il serait utile de le savoir.)

tbone
la source
1
L'exemple 2 de cette astuce concerne la recherche au niveau des colonnes.

Réponses:

12

Voici un exemple AdventureWorks sur l'affichage des dépendances de 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; 
Glen Swan
la source
Cela semble excellent. Pouvez-vous nous dire si cela souffre du tout ou POSSIBLEMENT des mêmes problèmes "périmés et obsolètes" que sysdepends? Voir: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone
AUSSI: Une idée si cela résoudrait les dépendances imbriquées? c'est-à-dire: un PROD dépend d'une VIEW qui dépend de TABLE.COLUMN: si nous fixons des critères sur TABLE & COLUMN, la vue et le proc s'afficheront-ils dans les résultats?
tbone
Je ne comprends tout simplement pas à quoi sert la wherecondition. TS voulait trouver des dépendances sur la colonne spécifique. Je pense que la condition doit être contrainte c.nameet ed.referenced_id/ ed.referenced_entity_name, non?
pkuderov
Ici en 2019 - sys.sql_dependenciesest maintenant en mode maintenance, et l'équipe Microsoft recommande d'utiliser uniquement sys.sql_expression_dependencies. Cela étant dit - cela ne ressemble pas à la sys.sql_expression_dependenciescapture du même niveau de détail.
10762409 dit Réintégrer Monica