Motor de base de datos realiza el seguimiento automático de la información de dependencia cuando hace referencia a entidades creadas, alteradas o quitadas, y graba esta información en el catálogo del sistema de SQL Server. Por ejemplo, si se crea un desencadenador que hace referencia a una tabla, se graba una dependencia entre estas entidades. Si, a continuación, quita el desencadenador, la información de dependencia se elimina del catálogo del sistema.
A diferencia de las versiones anteriores de SQL Server, donde el Id. realizaba el seguimiento de las dependencias, es ahora el nombre el que realiza el seguimiento de las dependencias. Esto significa que Motor de base de datos realiza el seguimiento de información de dependencia entre dos entidades aun cuando la entidad a la que se hace referencia no existe en el momento en que se crea la entidad de referencia. Esta circunstancia puede producirse debido a la resolución de nombres diferida. Por ejemplo, se puede crear correctamente un procedimiento almacenado que haga referencia a una tabla, pero no se puede ejecutar (aun cuando la tabla referenciada no existe en la base de datos). Motor de base de datos graba la dependencia entre el procedimiento y la tabla; sin embargo, no se puede grabar un Id. para la tabla porque el objeto no existe todavía. Si se crea la tabla después, el Id. de la tabla se devuelve con el resto de información de dependencia.
Se realiza el seguimiento de la información de dependencia cuando la entidad a la que se hace referencia aparece por nombre en una expresión SQL persistente de la entidad de referencia. Se obtiene información de dependencia cuando el nombre hace referencia a las entidades de las siguientes formas:
Utilizando cualquiera de las instrucciones siguientes en la definición de un módulo de Transact-SQL:
Instrucciones de lenguaje de manipulación de datos (SELECT, INSERT, UPDATE, DELETE, MERGE)
EXECUTE
DECLARE
SET (Cuando se utiliza SET con una función definida por el usuario o tipo definido por el usuario. Por ejemplo, DECLARE @var int; SET @var = dbo.udf1).
No se realiza el seguimiento de las entidades a las que se hace referencia en la definición de un módulo de Transact-SQL utilizando las instrucciones de lenguaje de definición de datos (DDL) como CREATE, ALTER o DROP.
Utilizando las instrucciones CREATE, ALTER o DROP TABLE cuando las instrucciones no están en un módulo de Transact-SQL y la entidad a la que se hace referencia es una función definida por el usuario de Transact-SQL, tipo definido por el usuario o colección de esquemas XML definidos en una columna calculada, restricción CHECK o la restricción DEFAULT.
Dependencias entre servidores y entre bases de datos
Se crea una dependencia entre bases de datos cuando una entidad realiza una referencia a otra entidad utilizando un nombre de tres partes válido. Se crea una referencia entre servidores cuando una entidad realiza una referencia a otra entidad utilizando un nombre de cuatro partes válido. Los nombres del servidor y de la base de datos solo se registran cuando se especifica el nombre explícitamente. Por ejemplo, cuando se especifica como MyServer.MyDB.MySchema.MyTable, se registran los nombres de la base de datos y servidor; sin embargo, cuando se especifica como MyServer..MySchema.MyTable, solo se registra el nombre del servidor. Para obtener información acerca de los nombres válidos de varias partes, vea Convenciones de sintaxis de Transact-SQL (Transact-SQL).
Se aplican las siguientes limitaciones:
No se realiza el seguimiento de dependencias entre servidores para OPENROWSET, OPENQUERY y las instrucciones OPENDATASOURCE.
No se realiza el seguimiento de las dependencias para el instrucción EXEC ('…') AT linked_server.
La tabla siguiente resume las dependencias entre bases de datos y entre servidores de las que se realiza el seguimiento y la información que se graba en el catálogo del sistema y cuyos informes se crearon mediante sys.sql_expression_dependencies (Transact-SQL).
Expresión SQL de un módulo | Se realiza seguimiento | Nombre de servidor al que se hace referencia | Nombre de base de datos a la que se hace referencia | Nombre de esquema al que se hace referencia | Nombre de entidad a la que se hace referencia |
|---|
SELECT * FROM s1.db2.sales.t1 | Sí | s1 | db2 | sales | t1 |
SELECT * FROM db3..t1 | Sí | | db3 | | t1 |
EXEC db2.dbo.Proc1 | Sí | | db2 | dbo | proc1 |
EXEC ('…') AT linked_srv1 | No | | | | |
EXEC linked_svr1.db2.sales.proc2 | Sí | linked_svr1 | db2 | sales | proc2 |
Efectos de la intercalación en el seguimiento de la dependencia
Una intercalación determina las reglas que ordenan y comparan los datos. La intercalación de la base de datos se utiliza para identificar información de dependencia en las entidades de la base de datos. Por ejemplo, si un procedimiento almacenado hace referencia a las entidades Some_Table y SOME_TABLE en una base de datos que utiliza una intercalación con distinción entre mayúsculas y minúsculas, se graba información de dependencia para dos entidades porque una comparación de los dos nombres indica que no son lo mismo. Si la base de datos utiliza una intercalación sin distinción entre mayúsculas y minúsculas, sin embargo, solo se graba una dependencia única.
Para las dependencias entre servidores y entre bases de datos, la intercalación del servidor en el que se encuentra el objeto de referencia se utiliza para resolver el nombre del servidor y la base de datos. La intercalación de la base de datos actual se utiliza para resolver el nombre del esquema y los nombres de objeto.
Tenga en cuenta la definición del procedimiento almacenado siguiente. Si el procedimiento almacenado se crea en una base de datos con una intercalación con distinción entre mayúsculas y minúsculas en una instancia de SQL Server con una intercalación del servidor sin distinción entre mayúsculas y minúsculas, se graban dos dependencias para las entidades srv_referenced.db_referenced.dbo.p_referenced y srv_referenced.db_referenced.DBO.P_REFERENCED.
CREATE PROCEDURE p_referencing AS
EXECUTE srv_referenced.db_referenced.dbo.p_referenced
EXECUTE srv_referenced.db_referenced.DBO.P_REFERENCED
EXECUTE SRV_REFERENCED.DB_REFERENCED.dbo.p_referenced;
Resolver las referencias ambiguas
Una referencia es ambigua cuando 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 en una columna de tipo xml.
Tenga en cuenta la definición del procedimiento almacenado siguiente.
CREATE PROCEDURE dbo.p1 AS
SELECT column_a, Sales.GetOrder() FROM Sales.MySales;
En el momento en que se crea el procedimiento almacenado, no se sabe si Sales.GetOrder() hace referencia a una función definida por el usuario denominada GetOrder en el esquema Sales o una columna denominada Sales de tipo UDT con un método denominado GetOrder(). Cuando una referencia es ambigua, la dependencia se indica como ambigua estableciendo la columna is_ambiguous de sys.sql_expression_dependencies y sys.dm_sql_referenced_entities en 1. Se crea un informe de la información de dependencia siguiente:
La dependencia entre el procedimiento almacenado y la tabla.
La dependencia entre el procedimiento almacenado y la función definida por el usuario. Si la función existe, se crea informe del Id. de la función; de lo contrario, el Id. será NULL.
La dependencia en la función se marca como ambigua. Es decir, is_ambiguous está establecido en 1.
No se crean informes de las dependencias de nivel de columna porque no se puede enlazar la instrucción en la que se hace referencia a las columnas.