Целта на обвързването на схемата на дефинирана от потребителя функция (UDF) е да се гарантира, че базовите обекти, посочени в UDF, не могат да бъдат модифицирани по начин, който би повлиял на дефиницията на функцията.
Това е добре, стига да не е необходимо да правите промени в основните обекти. Но какво ще стане, ако трябва да направите промени?
Можете да премахнете свързването на схема от UDF, да направите промените в основния обект/и, след което да приложите отново свързването на схемата.
Има два начина да премахнете обвързването на дефинирана от потребителя функция към нейните основни обекти:
- Променете функцията, така че нейната дефиниция вече да не посочва обвързването на схемата.
- Изхвърлете функцията (след това я създайте отново без обвързване на схема, ако е необходимо).
Пример за функция, обвързана със схема
Първо, ето пример за функция, свързана със схема:
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;
Знаем, че това е функция, свързана със схема, защото съдържа WITH SCHEMABINDING в неговата дефиниция. За да премахнем свързването на схемата, всичко, което трябва да направим, е да премахнем този бит.
Опция 1 – Промяна на функцията
За да премахнем свързването на схемата от тази функция, като я променим, можем да използваме следния код:
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;
Всичко, което направихме, беше да променим CREATE към ALTER и премахнете WITH SCHEMABINDING .
Опция 2 – Изхвърлете функцията
Ето пример за отпадане на функцията, след което повторното й създаване без обвързване на схема:
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;
В този случай използвах синтаксиса DROP IF EXISTS, който предотвратява възникването на грешка в случай, че функцията не съществува.