Formålet med skemabinding af en brugerdefineret funktion (UDF) er at sikre, at de basisobjekter, der refereres til i UDF'en, ikke kan ændres på en måde, der ville påvirke funktionens definition.
Dette er fint, så længe du ikke behøver at foretage ændringer i de underliggende objekter. Men hvad hvis du har brug for at foretage ændringer?
Du kan fjerne skemabinding fra en UDF, foretage ændringerne af basisobjektet/-erne og derefter genanvende skemabinding.
Der er to måder at fjerne bindingen af en brugerdefineret funktion til dens basisobjekter:
- Rediger funktionen, så dens definition ikke længere specificerer skemabinding.
- Slip funktionen (så genskab den uden skemabinding, hvis det er nødvendigt).
Eksempel på en skemabundet funktion
For det første er her et eksempel på en skemabundet funktion:
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;
Vi ved, at det er en skemabundet funktion, fordi den indeholder WITH SCHEMABINDING
i sin definition. For at fjerne skemabinding er alt, hvad vi skal gøre, at fjerne den bit.
Mulighed 1 – Skift funktionen
For at fjerne skemabinding fra denne funktion ved at ændre den, kan vi bruge følgende kode:
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;
Det eneste, vi gjorde, var at ændre CREATE
til ALTER
, og fjern WITH SCHEMABINDING
.
Mulighed 2 – Slip funktionen
Her er et eksempel på at droppe funktionen og derefter genskabe den uden skemabinding:
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;
I dette tilfælde brugte jeg DROP IF EXISTS-syntaksen, som forhindrer en fejl i at opstå i tilfælde af, at funktionen ikke eksisterer.