Celem schematu powiązania funkcji zdefiniowanej przez użytkownika (UDF) jest zapewnienie, że obiekty podstawowe, do których odwołuje się funkcja UDF, nie mogą być modyfikowane w sposób, który miałby wpływ na definicję funkcji.
Jest to w porządku, o ile nie musisz wprowadzać żadnych zmian w obiektach bazowych. Ale co, jeśli musisz wprowadzić zmiany?
Możesz usunąć powiązanie schematu z UDF, wprowadzić zmiany w podstawowych obiektach, a następnie ponownie zastosować powiązanie schematu.
Istnieją dwa sposoby na usunięcie powiązania funkcji zdefiniowanej przez użytkownika z jej obiektami podstawowymi:
- Zmień funkcję tak, aby jej definicja nie określała już powiązania schematu.
- Upuść funkcję (w razie potrzeby utwórz ją ponownie bez wiązania schematu).
Przykład funkcji powiązanej ze schematem
Oto przykład funkcji powiązanej ze schematem:
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;
Wiemy, że jest to funkcja powiązana ze schematem, ponieważ zawiera WITH SCHEMABINDING
w swojej definicji. Aby usunąć powiązanie schematu, wszystko, co musimy zrobić, to usunąć ten bit.
Opcja 1 – Zmień funkcję
Aby usunąć powiązanie schematu z tej funkcji poprzez jego zmianę, możemy użyć następującego kodu:
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;
Zmieniliśmy tylko CREATE
na ALTER
i usuń WITH SCHEMABINDING
.
Opcja 2 – Usuń funkcję
Oto przykład upuszczenia funkcji, a następnie ponownego jej utworzenia bez wiązania ze schematem:
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;
W tym przypadku użyłem składni DROP IF EXISTS, która zapobiega wystąpieniu błędu w przypadku, gdy funkcja nie istnieje.