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.