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.