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.