Partager via


sys.sql_expression_dependencies (Transact-SQL)

Contient une ligne pour chaque dépendance par nom sur une entité définie par l'utilisateur dans la base de données actuelle. Une dépendance entre deux entités est créée lorsqu'une entité, appelée entité référencée, apparaît par nom dans une expression SQL rendue persistante d'une autre entité, appelée entité de référence. Par exemple, lorsqu'une table est référencée dans la définition d'une vue, la vue, comme entité de référence, dépend de la table, l'entité référencée. Si la table est supprimée, la vue est inutilisable.

Vous pouvez utiliser cet affichage catalogue pour signaler des informations de dépendance pour les entités suivantes :

  • Entités liées au schéma.

  • Entités non liées au schéma.

  • Entités des bases de données croisées et entre serveurs. Les noms d'entités sont signalés ; toutefois, les ID d'entité ne sont pas résolus.

  • Dépendances au niveau des colonnes sur les entités liées au schéma. Les dépendances au niveau des colonnes pour les objets non liés au schéma peuvent être retournées en utilisant sys.dm_sql_referenced_entities.

  • Déclencheurs DDL au niveau du serveur dans le contexte de la base de données master.

Nom de la colonne

Type de données

Description

referencing_id

int

ID de l'entité de référence. N'accepte pas la valeur Null.

referencing_minor_id

int

ID de colonne lorsque l'entité de référence est une colonne ; sinon 0. N'accepte pas la valeur Null.

referencing_class

tinyint

Classe de l'entité de référence.

1 = Objet ou colonne

12 = Déclencheur DDL de base de données

13 = Déclencheur DDL de serveur

N'accepte pas la valeur Null.

referencing_class_desc

nvarchar(60)

Description de la classe de l'entité de référence.

OBJECT_OR_COLUMN

DATABASE_DDL_TRIGGER

SERVER_DDL_TRIGGER

N'accepte pas la valeur Null.

is_schema_bound_reference

bit

1 = l'entité référencée est liée au schéma.

0 = l'entité référencée n'est pas liée au schéma.

N'accepte pas la valeur Null.

referenced_class

tinyint

Classe de l'entité référencée.

1 = Objet ou colonne

6 = Type

10 = Collection du schéma XML

21 = Fonction de partition

N'accepte pas la valeur Null.

referenced_class_desc

nvarchar(60)

Description de la classe de l'entité référencée.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION

N'accepte pas la valeur Null.

referenced_server_name

sysname

Nom du serveur de l'entité référencée.

Cette colonne est remplie pour les dépendances entre serveurs qui sont établies en spécifiant un nom en quatre parties valide. Pour plus d'informations sur les noms en plusieurs parties, consultez Conventions de syntaxe de Transact-SQL (Transact-SQL).

NULL pour les entités non liées au schéma pour lesquelles l'entité a été référencée sans spécifier un nom en quatre parties.

NULL pour les entités liées au schéma, car elles doivent être dans la même base de données et par conséquent peuvent uniquement être définies à l'aide d'un nom en deux parties (schema.object).

referenced_database_name

sysname

Nom de la base de données de l'entité référencée.

Cette colonne est remplie pour les références des bases de données croisées et entre serveurs qui sont établies en spécifiant un nom en trois ou quatre parties valide.

NULL pour les références non liées au schéma en cas de spécification à l'aide d'un nom en une ou deux parties.

NULL pour les entités liées au schéma, car elles doivent être dans la même base de données et par conséquent peuvent uniquement être définies à l'aide d'un nom en deux parties (schema.object).

referenced_schema_name

sysname

Schéma auquel l'entité référencée appartient.

NULL pour les références non liées au schéma dans lesquelles l'entité a été référencée sans spécifier le nom de schéma.

Jamais NULL pour les références liées au schéma, car les entités liées au schéma doivent être définies et référencées en utilisant un nom en deux parties.

referenced_entity_name

sysname

Nom de l'entité référencée. N'accepte pas la valeur Null.

referenced_id

int

ID de l'entité référencée.

Toujours NULL pour les références des bases de données croisées et entre serveurs.

NULL pour les références dans la base de données si l'ID ne peut pas être déterminé. Pour les références non liées au schéma, l'ID ne peut pas être résolu dans les cas suivants :

  • L'entité référencée n'existe pas dans la base de données.

  • Le schéma de l'entité référencée dépend du schéma de l'appelant et est résolu au moment de l'exécution. Dans ce cas, is_caller_dependent a la valeur 1.

Jamais NULL pour les références liées au schéma.

referenced_minor_id

int

ID de la colonne référencée lorsque l'entité de référence est une colonne ; sinon 0. N'accepte pas la valeur Null.

Une entité référencée est une colonne lorsqu'une colonne est identifiée par son nom dans l'entité de référence, ou lorsque l'entité parente est utilisée dans une instruction SELECT *.

is_caller_dependent

bit

Indique que la liaison de schéma pour l'entité référencée se produit au moment de l'exécution ; par conséquent, la résolution de l'ID d'entité dépend du schéma de l'appelant. Cela se produit lorsque l'entité référencée est une procédure stockée, procédure stockée étendue ou fonction définie par l'utilisateur non liée au schéma appelée dans une instruction EXECUTE.

1 = l'entité référencée dépend de l'appelant et est résolue au moment de l'exécution. Dans ce cas, referenced_id a la valeur NULL.

0 = l'ID de l'entité référencée ne dépend pas de l'appelant.

Toujours 0 pour les références liées au schéma et pour les références des bases de données croisées et entre serveurs qui spécifient explicitement un nom de schéma. Par exemple, une référence à une entité au format EXEC MyDatabase.MySchema.MyProc ne dépend pas de l'appelant. Toutefois, une référence au format EXEC MyDatabase..MyProc dépend de l'appelant.

is_ambiguous

bit

Indique que la référence est équivoque et peut être convertie au moment de l'exécution en une fonction définie par l'utilisateur, un type défini par l'utilisateur ou une référence xquery à une colonne de type xml.

Par exemple, supposez que l'instruction SELECT Sales.GetOrder() FROM Sales.MySales est définie dans une procédure stockée. Jusqu'à ce que la procédure stockée soit exécutée, il n'est pas possible de savoir si Sales.GetOrder() est une fonction définie par l'utilisateur dans le schéma Sales ou une colonne nommée Sales de type défini par l'utilisateur avec une méthode nommée GetOrder().

1 = la référence est ambiguë.

0 = la référence n'est pas équivoque ou l'entité peut être liée avec succès lorsque la vue est appelée.

Toujours 0 pour les références liées au schéma.

Notes

Le tableau suivant répertorie les types des entités pour lesquelles les informations de dépendance sont créées et gérées. Les informations de dépendance ne sont pas créées ni gérées pour les règles, valeurs par défaut, tables temporaires, procédures stockées temporaires ou objets système.

Type d'entité

Entité de référence

Entité référencée

Table

Oui*

Oui

Vue

Oui

Oui

Index filtré

Oui**

Non

Statistiques filtrées

Oui**

Non

Procédure stockée Transact-SQL***

Oui

Oui

Procédure stockée CLR

Non

Oui

Fonction Transact-SQL définie par l'utilisateur

Oui

Oui

Fonction CLR définie par l'utilisateur

Non

Oui

Déclencheur CLR (DML et DDL)

Non

Non

Déclencheur DML Transact-SQL

Oui

Non

Déclencheur DDL au niveau de la base de données Transact-SQL

Oui

Non

Déclencheur DDL au niveau du serveur Transact-SQL

Oui

Non

Procédures stockées étendues

Non

Oui

File d'attente

Non

Oui

Synonyme

Non

Oui

Type (alias et type CLR défini par l'utilisateur)

Non

Oui

Collection de schémas XML

Non

Oui

Fonction de partition

Non

Oui

* Une table est suivie comme une entité de référence uniquement lorsqu'elle référence un module Transact-SQL, un type défini par l'utilisateur ou une collection de schémas XML dans la définition d'une colonne calculée, contrainte CHECK ou contrainte DEFAULT.

** Chaque colonne utilisée dans le prédicat de filtre est suivie en tant qu'entité de référence.

*** Les procédures stockées numérotées avec une valeur entière supérieure à 1 ne sont pas suivies en tant qu'entité de référence ou référencée.

Pour plus d'informations, consultez Description des dépendances SQL.

Autorisations

Requiert l'autorisation VIEW DEFINITION sur la base de données et l'autorisation SELECT sur sys.sql_expression_dependencies pour la base de données. Par défaut, l'autorisation SELECT est accordée uniquement aux membres du rôle de base de données fixe db_owner. Lorsque les autorisations SELECT et VIEW DEFINITION sont accordées à un autre utilisateur, le bénéficiaire peut consulter toutes les dépendances dans la base de données.

Exemples

A. Retour d'entités qui sont référencées par une autre entité

L'exemple suivant retourne les tables et colonnes référencées dans la vue Production.vProductAndDescription. La vue dépend des entités (tables et colonnes) retournées dans les colonnes referenced_entity_name et referenced_column_name.

USE AdventureWorks2008R2;
GO
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name, 
    o.type_desc AS referencing_desciption, 
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id, 
    referencing_class_desc, referenced_class_desc,
    referenced_server_name, referenced_database_name, referenced_schema_name,
    referenced_entity_name, 
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
    is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referencing_id = OBJECT_ID(N'Production.vProductAndDescription');
GO

B. Retour d'entités qui référencent une autre entité

L'exemple suivant retourne les entités qui référencent la table Production.Product. Les entités retournées dans la colonne referencing_entity_name dépendent de la table Product.

USE AdventureWorks2008R2;
GO
SELECT OBJECT_SCHEMA_NAME ( referencing_id ) AS referencing_schema_name,
    OBJECT_NAME(referencing_id) AS referencing_entity_name, 
    o.type_desc AS referencing_desciption, 
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id, 
    referencing_class_desc, referenced_class_desc,
    referenced_server_name, referenced_database_name, referenced_schema_name,
    referenced_entity_name, 
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
    is_caller_dependent, is_ambiguous
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N'Production.Product');
GO

C. Retour de dépendances de bases de données croisées

L'exemple suivant retourne toutes les dépendances de bases de données croisées. L'exemple crée d'abord la base de données db1 et deux procédures stockées qui référencent les tables dans les bases de données db2 et db3. La table sys.sql_expression_dependencies est alors interrogée pour signaler les dépendances de bases de données croisées entre les procédures et les tables. Remarquez que la valeur NULL est retournée dans la colonne referenced_schema_name pour l'entité référencée t3, car aucun nom de schéma n'a été spécifié pour cette entité dans la définition de la procédure.

CREATE DATABASE db1;
GO
USE db1;
GO
CREATE PROCEDURE p1 AS SELECT * FROM db2.s1.t1;
GO
CREATE PROCEDURE p2 AS
    UPDATE db3..t3
    SET c1 = c1 + 1;
GO
SELECT OBJECT_NAME (referencing_id),referenced_database_name, 
    referenced_schema_name, referenced_entity_name
FROM sys.sql_expression_dependencies
WHERE referenced_database_name IS NOT NULL;
GO
USE master;
GO
DROP DATABASE db1;
GO