Database
 sql >> Base de Dados >  >> RDS >> Database

Como verificar se um UDF T-SQL está vinculado ao esquema (mesmo quando criptografado)


A vinculação de esquema a um objeto como uma função definida pelo usuário (UDF) é considerada uma boa prática, pois impede que sejam feitas alterações em qualquer objeto referenciado que possa quebrar a função inadvertidamente.

Você pode associar ao esquema uma função definida pelo usuário no momento em que a cria ou pode alterá-la posteriormente.

Normalmente, você pode verificar se uma UDF está vinculada ao esquema no SQL Server visualizando sua definição. Normalmente, você pode fazer isso através da GUI selecionando “Script as Create” ou similar.

Você também pode fazer isso usando T-SQL selecionando a definition coluna do sys.sql_modules visualização do catálogo do sistema.

Mas isso só funcionará se o UDF não estiver criptografado.

No entanto, há outra coluna no sys.sql_modules view que serve ao nosso propósito se a UDF é criptografada ou não:is_schema_bound


Exemplo 1 – UDF criptografado


Aqui está um exemplo de como descobrir se uma função criptografada definida pelo usuário chamada udf_CatsByName_ITVF está vinculado ao esquema ou não.
SELECT 
  definition,
  is_schema_bound
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Resultado:
+--------------+-------------------+
| definition   | is_schema_bound   |
|--------------+-------------------|
| NULL         | 1                 |
+--------------+-------------------+

Nesse caso, a UDF é vinculada ao esquema.

Observe também que a definition coluna retorna NULL porque a função teve criptografia aplicada.

Exemplo 2 – UDF sem criptografia


Se a criptografia não tivesse sido aplicada, poderíamos ter visto a definição completa nessa coluna e teríamos visto o argumento WITH SCHEMABINDING na definição.

Aqui está a consulta novamente quando a função não está criptografada.
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
    );

              |
+--------------+

Eu removi o is_schema_bound coluna da consulta para facilitar a leitura.

De qualquer forma, o is_schema_bound pode ser usada independentemente de a UDF estar criptografada ou não.