Целта на обвързването на схемата на дефинирана от потребителя функция (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, който предотвратява възникването на грешка в случай, че функцията не съществува.