sql >> Base de Datos >  >> RDS >> Sqlserver

Buscar entidades de referencia en SQL Server:sys.dm_sql_referencing_entities()

En SQL Server, puede usar sys.dm_sql_referencing_entities() función de gestión dinámica del sistema para obtener una lista de todas las entidades en la base de datos actual que hacen referencia a otra entidad definida por el usuario por su nombre.

En otras palabras, devuelve una lista de entidades que dependen de la entidad dada.

Específicamente, informa sobre los siguientes tipos de entidades en la base de datos actual que hacen referencia a la entidad especificada:

  • Entidades vinculadas o no vinculadas al esquema
  • Disparadores DDL a nivel de base de datos
  • Disparadores DDL a nivel de servidor

Sintaxis

La sintaxis es así:

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

Ejemplo 1 – Ejemplo básico

He aquí un ejemplo básico de uso:

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

Resultado:

+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
| 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                     |
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+

En este ejemplo, hay seis entidades que hacen referencia a 'Application.Cities' en la base de datos 'WideWorldImporters'.

Microsoft recomienda específicamente no usar el asterisco (* ) para seleccionar todas las columnas de las vistas y funciones de administración dinámica (de las cuales sys.dm_sql_referencing_entities() es uno). Esto se debe a que sus esquemas y los datos que devuelven pueden cambiar en futuras versiones de SQL Server. Esto podría resultar en que se agreguen columnas al final de la lista de columnas en versiones futuras, lo que podría estropear su aplicación si confía en el asterisco para seleccionar todas las columnas.

Por lo tanto, el código anterior debe reescribirse a esto:

Ejemplo:

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');

Por supuesto, siempre puede especificar menos columnas si lo desea.

Ejemplo 2:obtener el tipo de entidad de referencia

El ejemplo anterior está muy bien, pero no nos dice el tipo de entidad de referencia. En otras palabras, no podemos ver si es una vista, un procedimiento almacenado, etc.

Puede obtener esta información uniéndose a sys.dm_sql_referencing_entities() con sys.objects .

Así que podríamos modificar el ejemplo anterior así:

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;  

Resultado:

+----------------------------------+-------------+-------------------------+
| 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               |
+----------------------------------+-------------+-------------------------+

Ejemplo 3:tipos definidos por el usuario

Aquí hay un ejemplo del uso de sys.dm_sql_referencing_entities() para devolver entidades que hacen referencia a un tipo de alias definido por el usuario.

Para este ejemplo, creé un alias definido por el usuario llamado clientcode . Luego lo usé en dos columnas (en dos tablas diferentes) y también creé un procedimiento almacenado que hace referencia al tipo por nombre (acepta un argumento llamado @ClientCode que es del clientcode tipo).

Para devolver un tipo definido por el usuario, use TYPE como segundo argumento.

Ejemplo:

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

Resultado:

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

Puedo decir por los nombres que ambos son procedimientos almacenados (ambos tienen el prefijo usp , que es una convención común cuando se crean procedimientos almacenados definidos por el usuario), pero podemos confirmarlo comprobando sys.objects vista de catálogo del sistema una vez más:

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;  

Resultado:

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

Tenga en cuenta que este tipo de alias se utiliza en las columnas de dos tablas de esta base de datos. Sin embargo, estos no aparecen en nuestra lista de dependencias porque el tipo definido por el usuario no está en la definición de una columna calculada, CHECK restricción, o DEFAULT restricción en la tabla.

Además, una de las tablas hace referencia a la otra tabla a través de una restricción de clave externa en la columna que usa el dbo.clientcode tipo definido por el usuario, pero esto tampoco aparece en nuestra lista.

Documentación Oficial

Para obtener información más detallada, consulte sys.dm_sql_referencing_entities en el sitio web de Microsoft.