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.