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.