El enlace de esquema de un objeto, como una función definida por el usuario (UDF), se considera una buena práctica, ya que evita que se realicen cambios en los objetos a los que hace referencia que podrían romper la función sin darse cuenta.
Puede vincular un esquema a una función definida por el usuario en el momento de crearla, o puede modificarla más adelante.
Normalmente, puede verificar si un UDF está vinculado a un esquema en SQL Server al ver su definición. Por lo general, puede hacer esto a través de la GUI seleccionando "Script as Create" o similar.
También puede hacerlo usando T-SQL seleccionando la definition
columna de sys.sql_modules
vista del catálogo del sistema.
Pero esto solo funcionará si el UDF no está encriptado.
Sin embargo, hay otra columna en sys.sql_modules
vista que sirve para nuestro propósito, ya sea que el UDF esté encriptado o no:is_schema_bound
Ejemplo 1:UDF cifrado
Este es un ejemplo de cómo averiguar si una función definida por el usuario encriptada llamada udf_CatsByName_ITVF
está vinculado al esquema o no.
SELECT definition, is_schema_bound FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultado:
+--------------+-------------------+ | definition | is_schema_bound | |--------------+-------------------| | NULL | 1 | +--------------+-------------------+
En este caso, la UDF está vinculada al esquema.
Observe también que la definition
columna devuelve NULL porque se ha aplicado el cifrado a la función.
Ejemplo 2:UDF sin cifrado
Si no se hubiera aplicado el cifrado, podríamos haber visto la definición completa en esa columna y habríamos visto el argumento WITH SCHEMABINDING
en la definición.
Aquí está la consulta nuevamente cuando la función no está encriptada.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Resultado:
+--------------+ | definition | |--------------| | CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); | +--------------+
Eliminé el is_schema_bound
columna de la consulta para que sea más fácil de leer.
De cualquier manera, el is_schema_bound
La columna se puede utilizar tanto si la UDF está cifrada como si no.