Het doel van schemabinding aan een door de gebruiker gedefinieerde functie (UDF) is om ervoor te zorgen dat de basisobjecten waarnaar in de UDF wordt verwezen niet kunnen worden gewijzigd op een manier die de definitie van de functie zou beïnvloeden.
Dit is prima, zolang u geen wijzigingen hoeft aan te brengen in de onderliggende objecten. Maar wat als u wijzigingen moet aanbrengen?
U kunt schemabinding van een UDF verwijderen, de wijzigingen aanbrengen in de basisobjecten en vervolgens schemabinding opnieuw toepassen.
Er zijn twee manieren om de binding van een door de gebruiker gedefinieerde functie aan zijn basisobjecten te verwijderen:
- Wijzig de functie zodat de definitie ervan niet langer schemabinding specificeert.
- Laat de functie vallen (maak hem indien nodig opnieuw aan zonder schemabinding).
Voorbeeld van een schemagebonden functie
Hier is eerst een voorbeeld van een schemagebonden functie:
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;
We weten dat het een schemagebonden functie is omdat het WITH SCHEMABINDING
. bevat in zijn definitie. Om schemabinding te verwijderen, hoeven we alleen dat bit te verwijderen.
Optie 1 – Wijzig de functie
Om schemabinding uit deze functie te verwijderen door deze te wijzigen, kunnen we de volgende code gebruiken:
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;
Het enige wat we deden was CREATE
veranderen naar ALTER
, en verwijder WITH SCHEMABINDING
.
Optie 2 – De functie laten vallen
Hier is een voorbeeld van het verwijderen van de functie en het opnieuw maken zonder schemabinding:
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 dit geval heb ik de DROP IF EXISTS-syntaxis gebruikt, die voorkomt dat er een fout optreedt als de functie niet bestaat.