Úč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.