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.