A finalidade de vincular um esquema a uma função definida pelo usuário (UDF) é garantir que os objetos base referenciados na UDF não possam ser modificados de uma maneira que afete a definição da função.
Isso é bom, desde que você não precise fazer nenhuma alteração nos objetos subjacentes. Mas e se você precisar fazer mudanças?
Você pode remover a vinculação de esquema de uma UDF, fazer as alterações no(s) objeto(s) base e reaplicar a vinculação de esquema.
Há duas maneiras de remover a vinculação de uma função definida pelo usuário a seus objetos base:
- Altere a função para que sua definição não especifique mais a vinculação de esquema.
- Elimine a função (em seguida, recrie-a sem vinculação de esquema, se necessário).
Exemplo de uma função vinculada ao esquema
Primeiro, aqui está um exemplo de uma função vinculada ao esquema:
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint WITH SCHEMABINDING AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Sabemos que é uma função vinculada ao esquema porque contém
WITH SCHEMABINDING
em sua definição. Para remover a ligação de esquema, tudo o que precisamos fazer é remover esse bit. Opção 1 - Alterar a Função
Para remover a vinculação de esquema desta função alterando-a, podemos usar o seguinte código:
ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Tudo o que fizemos foi alterar
CREATE
para ALTER
, e remova WITH SCHEMABINDING
. Opção 2 – Elimine a Função
Aqui está um exemplo de como descartar a função e recriá-la sem vinculação de esquema:
DROP FUNCTION IF EXISTS dbo.ufn_CountAlbums; GO CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Nesse caso, usei a sintaxe DROP IF EXISTS, que evita que ocorra um erro caso a função não exista.