sql >> Base de Datos >  >> RDS >> Database

Cómo verificar si un UDF de T-SQL está vinculado a un esquema (incluso cuando está cifrado)

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.