sql >> Database >  >> RDS >> Sqlserver

SCHEMABINDING verwijderen uit een door de gebruiker gedefinieerde functie in SQL Server

Het doel van schemabinding aan een door de gebruiker gedefinieerde functie (UDF) is om ervoor te zorgen dat de basisobjecten waarnaar in de UDF wordt verwezen niet kunnen worden gewijzigd op een manier die de definitie van de functie zou beïnvloeden.

Dit is prima, zolang u geen wijzigingen hoeft aan te brengen in de onderliggende objecten. Maar wat als u wijzigingen moet aanbrengen?

U kunt schemabinding van een UDF verwijderen, de wijzigingen aanbrengen in de basisobjecten en vervolgens schemabinding opnieuw toepassen.

Er zijn twee manieren om de binding van een door de gebruiker gedefinieerde functie aan zijn basisobjecten te verwijderen:

  • Wijzig de functie zodat de definitie ervan niet langer schemabinding specificeert.
  • Laat de functie vallen (maak hem indien nodig opnieuw aan zonder schemabinding).

Voorbeeld van een schemagebonden functie

Hier is eerst een voorbeeld van een schemagebonden functie:

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;

We weten dat het een schemagebonden functie is omdat het WITH SCHEMABINDING . bevat in zijn definitie. Om schemabinding te verwijderen, hoeven we alleen dat bit te verwijderen.

Optie 1 – Wijzig de functie

Om schemabinding uit deze functie te verwijderen door deze te wijzigen, kunnen we de volgende code gebruiken:

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;

Het enige wat we deden was CREATE veranderen naar ALTER , en verwijder WITH SCHEMABINDING .

Optie 2 – De functie laten vallen

Hier is een voorbeeld van het verwijderen van de functie en het opnieuw maken zonder schemabinding:

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;

In dit geval heb ik de DROP IF EXISTS-syntaxis gebruikt, die voorkomt dat er een fout optreedt als de functie niet bestaat.


  1. Een schuifbaar, bijwerkbaar ResultSet-object maken in JDBC

  2. Tabel- of kolomnaam mag niet beginnen met numeriek?

  3. 4 manieren om te controleren op dubbele rijen in SQL Server

  4. Controleer uw SQLite-versie