Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Rechercher des entités de référence dans SQL Server :sys.dm_sql_referencing_entities()

Dans SQL Server, vous pouvez utiliser le sys.dm_sql_referencing_entities() fonction de gestion dynamique du système pour obtenir une liste de toutes les entités de la base de données actuelle qui référencent une autre entité définie par l'utilisateur par son nom.

En d'autres termes, il renvoie une liste d'entités qui dépendent de l'entité donnée.

Plus précisément, il signale les types d'entités suivants dans la base de données actuelle qui référencent l'entité spécifiée :

  • Entités liées ou non liées au schéma
  • Déclencheurs DDL au niveau de la base de données
  • Déclencheurs DDL au niveau du serveur

Syntaxe

La syntaxe ressemble à ceci :

sys.dm_sql_referencing_entities (  
    ' schema_name.referenced_entity_name ' , '  ' )  
  
 ::=  
{  
    OBJECT  
  | TYPE  
  | XML_SCHEMA_COLLECTION  
  | PARTITION_FUNCTION  
}

Exemple 1 - Exemple de base

Voici un exemple basique d'utilisation :

USE WideWorldImporters;
SELECT *
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Résultat :

+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
| referencing_schema_name   | referencing_entity_name   | referencing_id   | referencing_class   | referencing_class_desc   | is_caller_dependent   |
|---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------|
| Application               | DetermineCustomerAccess   | 1051150790       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Integration               | GetCityUpdates            | 1758629308       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | Customers                 | 1694629080       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | SearchForCustomers        | 942626401        | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | SearchForSuppliers        | 926626344        | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | Suppliers                 | 1678629023       | 1                   | OBJECT_OR_COLUMN         | 0                     |
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+

Dans cet exemple, six entités font référence à "Application.Cities" dans la base de données "WideWorldImporters".

Microsoft recommande spécifiquement de ne pas utiliser l'astérisque (* ) pour sélectionner toutes les colonnes des vues et fonctions de gestion dynamique (dont sys.dm_sql_referencing_entities() est une). En effet, leurs schémas et les données qu'ils renvoient peuvent changer dans les futures versions de SQL Server. Cela pourrait entraîner l'ajout de colonnes à la fin de la liste des colonnes dans les versions futures, ce qui pourrait perturber votre application si vous comptez sur l'astérisque pour sélectionner toutes les colonnes.

Par conséquent, le code précédent doit être réécrit comme suit :

Exemple :

USE WideWorldImporters;
SELECT 
  referencing_schema_name,
  referencing_entity_name,
  referencing_id,
  referencing_class,
  referencing_class_desc,
  is_caller_dependent
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Bien sûr, vous pouvez toujours spécifier moins de colonnes si vous le souhaitez.

Exemple 2 - Obtenir le type d'entité de référence

L'exemple ci-dessus est très bien, mais il ne nous dit pas le type de l'entité de référence. En d'autres termes, nous ne pouvons pas voir s'il s'agit d'une vue, d'une procédure stockée, etc.

Vous pouvez obtenir ces informations en rejoignant sys.dm_sql_referencing_entities() avec sys.objects .

Nous pourrions donc modifier l'exemple précédent comme ceci :

SELECT 
  o.type_desc 'Type',
  re.referencing_schema_name 'Schema',
  re.referencing_entity_name 'Name'
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT') re
INNER JOIN sys.objects o
ON re.referencing_id = o.object_id
ORDER BY 'Type' ASC;  

Résultat :

+----------------------------------+-------------+-------------------------+
| Type                             | Schema      | Name                    |
|----------------------------------+-------------+-------------------------|
| SQL_INLINE_TABLE_VALUED_FUNCTION | Application | DetermineCustomerAccess |
| SQL_STORED_PROCEDURE             | Integration | GetCityUpdates          |
| SQL_STORED_PROCEDURE             | Website     | SearchForCustomers      |
| SQL_STORED_PROCEDURE             | Website     | SearchForSuppliers      |
| VIEW                             | Website     | Suppliers               |
| VIEW                             | Website     | Customers               |
+----------------------------------+-------------+-------------------------+

Exemple 3 - Types définis par l'utilisateur

Voici un exemple d'utilisation de sys.dm_sql_referencing_entities() pour renvoyer des entités qui font référence à un type d'alias défini par l'utilisateur.

Pour cet exemple, j'ai créé un alias défini par l'utilisateur appelé clientcode . Je l'ai ensuite utilisé dans deux colonnes (dans deux tables différentes), et j'ai également créé une procédure stockée qui référence le type par son nom (elle accepte un argument appelé @ClientCode qui est du clientcode type).

Pour renvoyer un type défini par l'utilisateur, utilisez TYPE comme deuxième argument.

Exemple :

USE Test;
SELECT 
  referencing_entity_name
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE');

Résultat :

+---------------------------+
| referencing_entity_name   |
|---------------------------|
| uspGetClient              |
| uspGetOrdersByClient      |
+---------------------------+

Je peux dire par les noms que ces deux procédures sont stockées (elles sont toutes deux préfixées par usp , qui est une convention courante lors de la création de procédures stockées définies par l'utilisateur), mais nous pouvons le confirmer en vérifiant le sys.objects afficher à nouveau le catalogue système :

SELECT 
  o.type_desc 'Type',
  re.referencing_schema_name 'Schema',
  re.referencing_entity_name 'Name'
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE') re
INNER JOIN sys.objects o
ON re.referencing_id = o.object_id
ORDER BY 'Type' ASC;  

Résultat :

+----------------------+----------+----------------------+
| Type                 | Schema   | Name                 |
|----------------------+----------+----------------------|
| SQL_STORED_PROCEDURE | dbo      | uspGetClient         |
| SQL_STORED_PROCEDURE | dbo      | uspGetOrdersByClient |
+----------------------+----------+----------------------+

Notez que ce type d'alias est utilisé dans les colonnes de deux tables de cette base de données. Cependant, ceux-ci n'apparaissent pas dans notre liste de dépendances car le type défini par l'utilisateur n'est pas dans la définition d'une colonne calculée, CHECK contrainte, ou DEFAULT contrainte dans le tableau.

De plus, l'une des tables fait référence à l'autre table via une contrainte de clé étrangère sur la colonne qui utilise le dbo.clientcode type défini par l'utilisateur, mais cela n'apparaît pas non plus dans notre liste.

Documentation officielle

Pour des informations plus détaillées, consultez sys.dm_sql_referencing_entities sur le site Web de Microsoft.