Účelem vazby schématu s uživatelsky definovanou funkcí (UDF) je zajistit, že základní objekty odkazované v UDF nelze upravit způsobem, který by ovlivnil definici funkce.
To je v pořádku, pokud nemusíte provádět žádné změny v základních objektech. Ale co když potřebujete provést změny?
Můžete odebrat vazbu schématu z UDF, provést změny v základním objektu/základních objektech a poté znovu použít vazbu schématu.
Existují dva způsoby, jak odstranit vazbu uživatelem definované funkce na její základní objekty:
- Změňte funkci tak, aby její definice již neurčovala vazbu schématu.
- Zrušte funkci (poté ji v případě potřeby znovu vytvořte bez vazby schématu).
Příklad funkce vázané na schéma
Nejprve je zde příklad funkce vázané na schéma:
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;
Víme, že je to funkce vázaná na schéma, protože obsahuje WITH SCHEMABINDING v jeho definici. Chcete-li odstranit vazbu schématu, vše, co musíme udělat, je odstranit tento bit.
Možnost 1 – Změňte funkci
K odstranění vazby schématu z této funkce její změnou můžeme použít následující kód:
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;
Vše, co jsme udělali, bylo změnit CREATE na ALTER a odstraňte WITH SCHEMABINDING .
Možnost 2 – Zrušte funkci
Zde je příklad zrušení funkce a jejího opětovného vytvoření bez vazby schématu:
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;
V tomto případě jsem použil syntaxi DROP IF EXISTS, která zabraňuje výskytu chyby v případě, že funkce neexistuje.