sys.dm_sql_referenced_entities (Transact-SQL)

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

Devuelve una fila para cada entidad definida por el usuario a la que se hace referencia por nombre en la definición de la entidad de referencia especificada en SQL Server. Se crea una dependencia entre dos entidades cuando una entidad definida por el usuario, denominada entidad a la que se hace referencia, aparece por nombre en una expresión SQL persistente de otra entidad definida por el usuario, denominada entidad de referencia. Por ejemplo, si un procedimiento almacenado es la entidad especificada de referencia, esta función devuelve todas las entidades definidas por el usuario a las que se hace referencia en el procedimiento almacenado, como tablas, vistas, tipos definidos por el usuario (UDT) u otros procedimientos almacenados.

Puede usar esta función de administración dinámica para notificar los siguientes tipos de entidades referenciadas por la entidad de referencia especificada:

  • Entidades enlazadas a esquema

  • Entidades no enlazadas a esquema

  • Entidades entre servidores y entre bases de datos

  • Dependencias de nivel de columna en entidades enlazadas y no enlazadas a esquema

  • Tipos definidos por el usuario (alias y CLR UDT)

  • Colecciones de esquemas XML

  • Funciones de partición

Sintaxis

sys.dm_sql_referenced_entities (  
    ' [ schema_name. ] referencing_entity_name ' ,
    ' <referencing_class> ' )  
  
<referencing_class> ::=  
{  
    OBJECT  
  | DATABASE_DDL_TRIGGER  
  | SERVER_DDL_TRIGGER  
}  

Argumentos

[ schema_name. ] referencing_entity_name
Es el nombre de la entidad que hace la referencia. schema_name es necesario cuando la clase de referencia es OBJECT.

schema_name.referencing_entity_name es nvarchar(517).

<> referencing_class ::= { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Es la clase de la entidad de referencia especificada. Solo se puede especificar una clase por instrucción.

<> referencing_class es nvarchar(60).

Tabla devuelta

Nombre de la columna Tipo de datos Descripción
referencing_minor_id int Identificador de la columna cuando la entidad de referencia es una columna; en caso contrario, es 0. No admite valores NULL.
referenced_server_name sysname Nombre del servidor de la entidad a la que se hace referencia.

Esta columna se rellena para las dependencias entre servidores especificadas con un nombre de cuatro partes válido. Para más información sobre los nombres con varias partes, consulte Convenciones de sintaxis de Transact-SQL.

NULL para las dependencias no enlazadas a esquema para las que se hizo referencia a la entidad sin especificar un nombre de cuatro partes.

NULL para las entidades enlazadas a esquema porque deben estar en la misma base de datos y, por tanto, solo pueden definirse con un nombre de dos partes (schema.object).
referenced_database_name sysname Nombre de la base de datos de la entidad a la que se hace referencia.

Esta columna se rellena para las referencias entre bases de datos o entre servidores especificadas con un nombre válido de tres o cuatro partes.

NULL para las referencias no enlazadas a esquema especificadas con un nombre de una o dos partes.

NULL para las entidades enlazadas a esquema porque deben estar en la misma base de datos y, por tanto, solo pueden definirse con un nombre de dos partes (schema.object).
referenced_schema_name sysname Esquema al que pertenece la entidad a la que se hace referencia.

NULL para las referencias no enlazadas a esquema en las que se hacía referencia a la entidad sin especificar el nombre del esquema.

Nunca es NULL para las referencias enlazadas a un esquema.
referenced_entity_name sysname Nombre de la entidad a la que se hace referencia. No admite valores NULL.
referenced_minor_name sysname Nombre de la columna cuando la entidad a la que se hace referencia es una columna; en caso contrario, es NULL. Por ejemplo, referenced_minor_name es NULL en la fila que contiene la propia entidad a la que se hace referencia.

Una entidad a la que se hace referencia es una columna cuando una columna se identifica mediante un nombre en la entidad de referencia o cuando la entidad primaria se usa en una instrucción SELECT *.
referenced_id int Identificador de la entidad a la que se hace referencia. Cuando el valor de referenced_minor_id no es 0, referenced_id es la entidad en la que se define la columna.

Siempre es NULL para las referencias entre servidores.

NULL para las referencias entre bases de datos cuando no se puede determinar el identificador porque la base de datos está sin conexión o no se puede enlazar la entidad.

NULL para las referencias dentro de la base de datos si no se puede determinar el identificador. En el caso de las referencias no enlazadas a esquemas, el identificador no se puede resolver cuando la entidad a la que se hace referencia no existe en la base de datos o cuando la resolución de nombres depende del autor de la llamada. En este último caso, is_caller_dependent se establece en 1.

Nunca es NULL para las referencias enlazadas a un esquema.
referenced_minor_id int Identificador de la columna cuando la entidad a la que se hace referencia es una columna; en caso contrario, es 0. Por ejemplo, referenced_minor_name es 0 en la fila que contiene la propia entidad a la que se hace referencia.

Para las referencias no enlazadas a esquema, se notifican las dependencias de las columnas únicamente cuando se pueden enlazar todas las entidades a las que se hace referencia. Si no se pueden enlazar todas las entidades a las que se hace referencia, no se notifican las dependencias del nivel de columna y referenced_minor_id es 0. Vea el ejemplo D.
referenced_class tinyint Clase de la entidad a la que se hace referencia.

1 = Objeto o columna

6 = Tipo

10 = Colección de esquemas XML

21 = Función de partición
referenced_class_desc nvarchar(60) Descripción de la clase de la entidad a la que se hace referencia.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Indica que el enlace de esquema de la entidad a la que se hace referencia se realiza en tiempo de ejecución; por consiguiente, la resolución del identificador de la entidad depende del esquema del autor de la llamada. Esto ocurre cuando la entidad a la que se hace referencia es un procedimiento almacenado, un procedimiento almacenado extendido o una función definida por el usuario llamada en una instrucción EXECUTE.

1 = La entidad a la que se hace referencia es dependiente del autor de la llamada y se resuelve en tiempo de ejecución. En este caso, referenced_id es NULL.

0 = El identificador de la entidad a la que se hace referencia no es dependiente del autor de la llamada. Es siempre 0 para las referencias enlazadas a esquema y para las referencias entre bases de datos o entre servidores que especifican explícitamente un nombre de esquema. Por ejemplo, una referencia a una entidad con el formato EXEC MyDatabase.MySchema.MyProc no es dependiente del autor de la llamada. Sin embargo, una referencia con el formato EXEC MyDatabase..MyProc es dependiente del autor de la llamada.
is_ambiguous bit Indica que la referencia es ambigua y se puede resolver en tiempo de ejecución en una función definida por el usuario, un tipo definido por el usuario (UDT) o una referencia xquery a una columna de tipo xml. Por ejemplo, supongamos que la instrucción SELECT Sales.GetOrder() FROM Sales.MySales está definida en un procedimiento almacenado. Hasta que no se ejecute el procedimiento almacenado, no se sabrá si Sales.GetOrder() es una función definida por el usuario en el esquema Sales o en la columna con nombre Sales de tipo UDT con un método denominado GetOrder().

1 = La referencia a una función definida por el usuario o el método de tipo definido por el usuario (UDT) de columna es ambiguo.

0 = La referencia no es ambigua o la entidad puede enlazarse correctamente cuando se llama a la función.

Siempre es 0 para las referencias enlazadas a esquema.
is_selected bit 1 = Se ha seleccionado el objeto o la columna.
is_updated bit 1 = Se ha modificado el objeto o la columna.
is_select_all bit 1= El objeto se usa en la cláusula SELECT * (solo en el nivel de objeto).
is_all_columns_found bit 1 = Se pueden encontrar todas las dependencias de columna del objeto.

0 = No se pueden encontrar las dependencias de columna del objeto.
is_insert_all bit 1 = El objeto se usa en una instrucción INSERT sin una lista de columnas (solo a nivel de objeto).

Esta columna se agregó en SQL Server 2016.
is_incomplete bit 1 = El objeto o columna tiene un error de enlace y está incompleto.

Esta columna se agregó en SQL Server 2016 SP2.

Excepciones

Devuelve un conjunto de resultados vacío si se da alguna de las condiciones siguientes:

  • Se especifica un objeto del sistema.

  • La entidad especificada no existe en la base de datos actual.

  • La entidad especificada no hace referencia a ninguna entidad.

  • Se pasó un parámetro no válido.

Devuelve un error si la entidad especificada de referencia es un procedimiento almacenado numerado.

Devuelve el error 2020 cuando no se pueden resolver las dependencias de columna. Este error no impide que la consulta devuelva dependencias de nivel de objeto.

Comentarios

Se puede ejecutar esta función en el contexto de cualquier base de datos para devolver las entidades que hacen referencia a un desencadenador DDL de servidor.

La tabla siguiente enumera los tipos de entidades para las que se crea y mantiene la información de dependencia. La información de dependencia no se crea ni mantiene para reglas, valores predeterminados, tablas temporales, procedimientos almacenados temporales u objetos del sistema.

Tipo de entidad Entidad que hace la referencia Entidad a la que se hace referencia
Tabla Sí*
Ver
Procedimiento almacenado de Transact-SQL**
procedimiento almacenado CLR No
Función Transact-SQL definida por el usuario
Función CLR definida por el usuario No
Desencadenador CLR (DML y DDL) No No
Desencadenador DML de Transact-SQL No
Desencadenador DDL de nivel de la base de datos de Transact-SQL No
Desencadenador DDL de nivel de servidor de Transact-SQL No
Procedimientos almacenados extendidos No
Cola No
Synonym (Sinónimo) No
Tipo (tipo CLR y alias definido por el usuario) No
Colección de esquemas XML No
Función de partición No

* Se realiza el seguimiento de una tabla como una entidad de referencia solo si hace referencia a un módulo de Transact-SQL, un tipo definido por el usuario o una colección de esquemas XML en la definición de una columna calculada, restricción CHECK o restricción DEFAULT.

** No se realiza el seguimiento de los procedimientos almacenados numerados con un valor entero mayor que 1 como la entidad que hace referencia ni como la entidad a la que se hace referencia.

Permisos

Requiere el permiso SELECT en sys.dm_sql_referenced_entities y el permiso VIEW DEFINITION en la entidad de referencia. De forma predeterminada, se concede el permiso SELECT a public. Requiere el permiso VIEW DEFINITION en la base de datos o el permiso ALTER DATABASE DDL TRIGGER en la base de datos si la entidad de referencia es un desencadenador DDL de base de datos. Requiere el permiso VIEW ANY DEFINITION en el servidor si la entidad de referencia es un desencadenador DDL de servidor.

Ejemplos

A Devolver entidades a las que hace referencia un desencadenador DDL de nivel de base de datos

El ejemplo siguiente devuelve las entidades (tablas y columnas) a las que hace referencia el desencadenador DDL de base de datos ddlDatabaseTriggerLog.

USE AdventureWorks2022;  
GO  
SELECT
        referenced_schema_name,
        referenced_entity_name,
        referenced_minor_name,
        referenced_minor_id,
        referenced_class_desc
    FROM
        sys.dm_sql_referenced_entities (
            'ddlDatabaseTriggerLog',
            'DATABASE_DDL_TRIGGER')
;
GO  

B. Devolver entidades a las que hace referencia un objeto

El ejemplo siguiente devuelve las entidades a las que hace referencia la función definida por el usuario dbo.ufnGetContactInformation.

USE AdventureWorks2022;  
GO  
SELECT
        referenced_schema_name,
        referenced_entity_name,
        referenced_minor_name,
        referenced_minor_id,
        referenced_class_desc,
        is_caller_dependent,
        is_ambiguous
    FROM
        sys.dm_sql_referenced_entities (
            'dbo.ufnGetContactInformation',
            'OBJECT')
;
GO  

C. Devolver dependencias de columna

El ejemplo siguiente crea la tabla Table1 con la columna calculada c, definida como la suma de las columnas a y b. A continuación, se llama a la vista sys.dm_sql_referenced_entities. La vista devuelve dos filas, una para cada columna definida en la columna calculada.

CREATE TABLE dbo.Table1 (a int, b int, c AS a + b);  
GO  
SELECT
        referenced_schema_name AS schema_name,  
        referenced_entity_name AS table_name,  
        referenced_minor_name  AS referenced_column,  
        COALESCE(
            COL_NAME(OBJECT_ID(N'dbo.Table1'),
            referencing_minor_id),
            'N/A') AS referencing_column_name  
    FROM
        sys.dm_sql_referenced_entities ('dbo.Table1', 'OBJECT')
;
GO

-- Remove the table.  
DROP TABLE dbo.Table1;  
GO  

Este es el conjunto de resultados.

schema_name table_name referenced_column referencing_column  
----------- ---------- ----------------- ------------------  
dbo         Table1     a                 c  
dbo         Table1     b                 c  

D. Devolver dependencias de las columnas no enlazadas a esquema

En el ejemplo siguiente se quita Table1 y se crea Table2 y el procedimiento almacenado Proc1. El procedimiento hace referencia a Table2 y a la tabla no existente Table1. La vista sys.dm_sql_referenced_entities se ejecuta con el procedimiento almacenado especificado como la entidad de referencia. El conjunto de resultados muestra una fila para Table1 y tres filas para Table2. Como Table1 no existe, no se pueden resolver las dependencias de columna y se devuelve el error 2020. La columna is_all_columns_found devuelve 0 para Table1, lo que indica que había columnas que no se pudieron detectar.

DROP TABLE IF EXISTS dbo.Table1;
GO  
CREATE TABLE dbo.Table2 (c1 int, c2 int);  
GO  
CREATE PROCEDURE dbo.Proc1 AS  
    SELECT a, b, c FROM Table1;  
    SELECT c1, c2 FROM Table2;  
GO  
SELECT
        referenced_id,
        referenced_entity_name AS table_name,
        referenced_minor_name  AS referenced_column_name,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  

Este es el conjunto de resultados.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1  
935674381     Table2       C1                      1  
935674381     Table2       C2                      1  
NULL          Table1       NULL                    0  

Msg 2020, Level 16, State 1, Line 1
The dependencies reported for entity "dbo.Proc1" might not include
 references to all columns. This is either because the entity
 references an object that does not exist or because of an error
 in one or more statements in the entity.  Before rerunning the
 query, ensure that there are no errors in the entity and that
 all objects referenced by the entity exist.

E. Ejemplo de mantenimiento dinámico de las dependencias

En este ejemplo E se supone que se ha ejecutado el ejemplo D. En el ejemplo E se muestra que las dependencias se mantienen dinámicamente. En el ejemplo se hace lo siguiente:

  1. Vuelve a crear Table1, que se quitó en el ejemplo D.
  2. Ejecute Entonces sys.dm_sql_referenced_entities se vuelve a ejecutar con el procedimiento almacenado especificado como la entidad de referencia.

El conjunto de resultados muestra que se devuelven ambas tablas y sus respectivas columnas definidas en el procedimiento almacenado. Además, la columna is_all_columns_found devuelve un 1 para todos los objetos y columnas.

CREATE TABLE Table1 (a int, b int, c AS a + b);  
GO   
SELECT
        referenced_id,
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  
DROP TABLE Table1, Table2;  
DROP PROC Proc1;  
GO  

Este es el conjunto de resultados.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1 
935674381     Table2       c1                      1 
935674381     Table2       c2                      1 
967674495     Table1       NULL                    1 
967674495     Table1       a                       1  
967674495     Table1       b                       1  
967674495     Table1       c                       1  

F. Devolución del uso de objetos o columnas

El ejemplo siguiente devuelve los objetos y las dependencias de columna del procedimiento almacenado HumanResources.uspUpdateEmployeePersonalInfo. Este procedimiento actualiza las columnas , y Gender de la Employee tabla en función de un valor especificadoBusinessEntityID. BirthDate,``MaritalStatusNationalIDNumber Otro procedimiento almacenado, upsLogError se define en un TRY... Bloque CATCH para capturar los errores de ejecución. Las columnas is_selected, is_updated y is_select_all devuelven información sobre cómo se utilizan estos objetos y columnas dentro del objeto de referencia. La tabla y las columnas que se modifican se indican mediante un 1 en la columna is_updated. La columna BusinessEntityID solo se selecciona y el procedimiento almacenado uspLogError ni se selecciona ni se modifica.

USE AdventureWorks2022;
GO
SELECT
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_selected,  is_updated,  is_select_all
    FROM
        sys.dm_sql_referenced_entities(
            'HumanResources.uspUpdateEmployeePersonalInfo',
            'OBJECT')
;

Este es el conjunto de resultados.

table_name    column_name         is_selected is_updated is_select_all  
------------- ------------------- ----------- ---------- -------------  
uspLogError   NULL                0           0          0  
Employee      NULL                0           1          0  
Employee      BusinessEntityID    1           0          0  
Employee      NationalIDNumber    0           1          0  
Employee      BirthDate           0           1          0  
Employee      MaritalStatus       0           1          0  
Employee      Gender              0           1          0

Consulte también

sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL)