Syftet med att schemabinda en användardefinierad funktion (UDF) är att säkerställa att basobjekten som refereras till i UDF inte kan modifieras på ett sätt som skulle påverka funktionens definition.
Detta är bra, så länge du inte behöver göra några ändringar i de underliggande objekten. Men vad händer om du behöver göra ändringar?
Du kan ta bort schemabindning från en UDF, göra ändringarna i basobjektet/en och sedan tillämpa schemabindning igen.
Det finns två sätt att ta bort bindningen av en användardefinierad funktion till dess basobjekt:
- Ändra funktionen så att dess definition inte längre anger schemabindning.
- Släpp funktionen (återskapa den sedan utan schemabindning om det behövs).
Exempel på en schemabunden funktion
Först, här är ett exempel på en schemabunden 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 vet att det är en schemabunden funktion eftersom den innehåller WITH SCHEMABINDING
i sin definition. För att ta bort schemabindning behöver vi bara ta bort den biten.
Alternativ 1 – Ändra funktionen
För att ta bort schemabindning från den här funktionen genom att ändra den, kan vi använda följande kod:
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;
Allt vi gjorde var att ändra CREATE
till ALTER
, och ta bort WITH SCHEMABINDING
.
Alternativ 2 – Släpp funktionen
Här är ett exempel på att ta bort funktionen och sedan återskapa den utan schemabindning:
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 det här fallet använde jag syntaxen DROP IF EXISTS, som förhindrar att ett fel uppstår om funktionen inte existerar.