sql >> Databáze >  >> RDS >> Sqlserver

Odebrat SCHEMABINDING z funkce definované uživatelem na serveru SQL Server

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


  1. MySQL Group od SUM

  2. Stránkování pomocí OFFSET / FETCH:Lepší způsob

  3. OPENROWSET nepřijímá proměnné pro své argumenty (SQL Server)

  4. Operátor SQL se nerovná () pro začátečníky