Descripción de las dependencias SQL

Las dependencias SQL son las referencias por nombre utilizadas en expresiones SQL para hacer que una entidad definida por el usuario dependa de otra. Una entidad que hace referencia a otra en su definición, se denominará entidad de referencia (si esa definición se almacena en el catálogo del sistema). Una entidad a la que hace referencia otra entidad se denomina una entidad a la que se hace referencia. Hay dos tipos de dependencia a la que Database Engine (Motor de base de datos) ha realizado un seguimiento.

  • Dependencia enlazada a esquema

    Una Dependencia enlazada a esquema es una relación entre dos entidades que evita que la entidad a la que se hace referencia se elimine o modifique mientras exista la entidad de referencia. Se inicia una Dependencia enlazada a esquema cuando se crea una vista o función definida por el usuario utilizando la cláusula WITH SCHEMABINDING. También se puede crear una Dependencia enlazada a esquema cuando una tabla hace referencia a otra entidad como, por ejemplo, una función definida por el usuario de Transact-SQL, un tipo definido por el usuario o una colección de esquemas XML en una restricción CHECK o DEFAULT, o bien en la definición de una columna calculada. Si se especifica un objeto mediante un nombre de dos partes (schema_name.object_name), no se certifica como una referencia enlazada a un esquema.

  • Dependencia no enlazada a esquema

    Una Dependencia no enlazada a esquema es una relación entre dos entidades que no evita que la entidad referenciada se elimine o modifique.

En la siguiente ilustración se muestra un ejemplo de una dependencia SQL.

Representación de una dependencia SQL

En la ilustración, se muestran dos entidades: el procedimiento X y el procedimiento Y. El procedimiento X contiene una expresión SQL que tiene una referencia por nombre al procedimiento Y. El procedimiento X se conoce como la entidad dependiente o de referencia, mientras que el procedimiento Y se conoce como la entidad independiente o referenciada. Dado que el procedimiento X depende del procedimiento Y, el procedimiento X generará un error en tiempo de ejecución si el procedimiento Y no existe. Sin embargo, el procedimiento Y no generará error si el procedimiento X no existe.

El ejemplo siguiente muestra cómo el procedimiento almacenado X puede depender del procedimiento almacenado Y.

USE tempdb;
GO
CREATE PROCEDURE dbo.Y AS
SELECT * FROM sys.objects
GO
CREATE PROCEDURE dbo.X as
    EXEC dbo.Y;
GO

Para ver la dependencia de X en Y, ejecute la consulta siguiente.

SELECT * 
FROM sys.sql_expression_dependencies 
WHERE referencing_id = OBJECT_ID('X')
    AND referenced_id = OBJECT_ID('Y')
    AND referenced_schema_name = 'dbo'
    AND referenced_entity_name = 'Y'
    AND referenced_database_name IS NULL
    AND referenced_server_name IS NULL;
GO

Tipos de referencia y entidades referenciadas

La tabla siguiente enumera los tipos de entidades para las que se crea y mantiene la información de dependencia. La tabla indica si se realiza el seguimiento de la entidad como una entidad de referencia o como una referenciada. 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 de referencia

entidad a la que se hace referencia

Tabla

Sí*

Vista

Procedimiento almacenado Transact-SQL**

Procedimiento almacenado CLR

No

Función definida por el usuario de Transact-SQL

Función definida por el usuario CLR

No

Desencadenador CLR (DML y DDL)

No

No

Desencadenador DML de Transact-SQL

No

Desencadenador DLL de nivel de base de datos de Transact-SQL

No

Desencadenador DDL de servidor Transact-SQL

No

Procedimientos almacenados extendidos

No

Cola

No

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 Transact-SQL, un tipo definido por el usuario o una colección de esquemas XML en la definición de una columna calculada, una restricción CHECK o una restricción DEFAULT.

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

Cómo se realiza el seguimiento de la información de dependencia

Database Engine (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 Database Engine (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). Database Engine (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 sólo 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, sólo 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

s1

db2

sales

t1

SELECT * FROM db3..t1

 

db3

 

t1

EXEC db2.dbo.Proc1

 

db2

dbo

proc1

EXEC ('…') AT linked_srv1

No

 

 

 

 

EXEC linked_svr1.db2.sales.proc2

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, sólo 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 a nivel de columna porque no se puede enlazar la instrucción en la que se hace referencia a las columnas.

Mantener las dependencias

Database Engine (Motor de base de datos) mantiene las dependencias enlazadas a un esquema y no enlazadas a un esquema. Estas dependencias se actualizan automáticamente durante cualquier operación que influye en el seguimiento de dependencia, por ejemplo, al actualizar una base de datos a partir de una versión anterior de SQL Server o al cambiar la intercalación de una base de datos.

Historial de cambios

Contenido actualizado

Se quita la frase "No se realiza un seguimiento de las dependencias de las columnas para las funciones CLR con valores de tabla" de la sección Notas.