Der Zweck der Schemabindung einer benutzerdefinierten Funktion (UDF) besteht darin, sicherzustellen, dass die Basisobjekte, auf die in der UDF verwiesen wird, nicht in einer Weise geändert werden können, die sich auf die Definition der Funktion auswirken würde.
Das ist in Ordnung, solange Sie keine Änderungen an den zugrunde liegenden Objekten vornehmen müssen. Aber was ist, wenn Sie Änderungen vornehmen müssen?
Sie können die Schemabindung aus einer UDF entfernen, die Änderungen an den Basisobjekten vornehmen und dann die Schemabindung erneut anwenden.
Es gibt zwei Möglichkeiten, die Bindung einer benutzerdefinierten Funktion an ihre Basisobjekte zu entfernen:
- Ändern Sie die Funktion so, dass ihre Definition keine Schemabindung mehr angibt.
- Löschen Sie die Funktion (erstellen Sie sie anschließend ohne Schemabindung neu, falls erforderlich).
Beispiel einer schemagebundenen Funktion
Hier ist zunächst ein Beispiel für eine schemagebundene 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;
Wir wissen, dass es sich um eine schemagebundene Funktion handelt, da sie WITH SCHEMABINDING
enthält in seiner Definition. Um die Schemabindung zu entfernen, müssen wir nur dieses Bit entfernen.
Option 1 – Funktion ändern
Um die Schemabindung von dieser Funktion zu entfernen, indem wir sie ändern, können wir den folgenden Code verwenden:
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;
Wir haben lediglich CREATE
geändert zu ALTER
, und entfernen Sie WITH SCHEMABINDING
.
Option 2 – Funktion löschen
Hier ist ein Beispiel für das Löschen der Funktion und das anschließende erneute Erstellen ohne Schemabindung:
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 diesem Fall habe ich die DROP IF EXISTS-Syntax verwendet, die verhindert, dass ein Fehler auftritt, falls die Funktion nicht existiert.