Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Rimuovere SCHEMABINDING da una funzione definita dall'utente in SQL Server

Lo scopo dell'associazione dello schema di una funzione definita dall'utente (UDF) è garantire che gli oggetti di base a cui si fa riferimento nell'UDF non possano essere modificati in modo tale da influire sulla definizione della funzione.

Questo va bene, purché non sia necessario apportare modifiche agli oggetti sottostanti. Ma cosa succede se devi apportare modifiche?

Puoi rimuovere il binding dello schema da una UDF, apportare le modifiche all'oggetto o agli oggetti di base, quindi riapplicare il binding dello schema.

Esistono due modi per rimuovere l'associazione di una funzione definita dall'utente ai suoi oggetti di base:

  • Modificare la funzione in modo che la sua definizione non specifichi più l'associazione dello schema.
  • Elimina la funzione (quindi ricreala senza l'associazione dello schema, se necessario).

Esempio di funzione legata allo schema

Innanzitutto, ecco un esempio di una funzione associata allo schema:

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;

Sappiamo che è una funzione legata allo schema perché contiene WITH SCHEMABINDING nella sua definizione. Per rimuovere il binding dello schema, tutto ciò che dobbiamo fare è rimuovere quel bit.

Opzione 1 – Modifica la funzione

Per rimuovere l'associazione dello schema da questa funzione alterandola, possiamo utilizzare il codice seguente:

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;

Tutto quello che abbiamo fatto è stato cambiare CREATE a ALTER e rimuovi WITH SCHEMABINDING .

Opzione 2:elimina la funzione

Ecco un esempio di eliminazione della funzione, quindi di ricreazione senza associazione dello schema:

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;

In questo caso, ho utilizzato la sintassi DROP IF EXISTS, che impedisce il verificarsi di un errore nel caso in cui la funzione non esistesse.