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.