Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Remover SCHEMABINDING de uma função definida pelo usuário no SQL Server


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.