Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entfernen Sie SCHEMABINDING aus einer benutzerdefinierten Funktion in SQL Server

Der Zweck der Schemabindung einer benutzerdefinierten Funktion (UDF) besteht darin, sicherzustellen, dass die Basisobjekte, auf die in der UDF verwiesen wird, nicht in einer Weise geändert werden können, die sich auf die Definition der Funktion auswirken würde.

Das ist in Ordnung, solange Sie keine Änderungen an den zugrunde liegenden Objekten vornehmen müssen. Aber was ist, wenn Sie Änderungen vornehmen müssen?

Sie können die Schemabindung aus einer UDF entfernen, die Änderungen an den Basisobjekten vornehmen und dann die Schemabindung erneut anwenden.

Es gibt zwei Möglichkeiten, die Bindung einer benutzerdefinierten Funktion an ihre Basisobjekte zu entfernen:

  • Ändern Sie die Funktion so, dass ihre Definition keine Schemabindung mehr angibt.
  • Löschen Sie die Funktion (erstellen Sie sie anschließend ohne Schemabindung neu, falls erforderlich).

Beispiel einer schemagebundenen Funktion

Hier ist zunächst ein Beispiel für eine schemagebundene Funktion:

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;

Wir wissen, dass es sich um eine schemagebundene Funktion handelt, da sie WITH SCHEMABINDING enthält in seiner Definition. Um die Schemabindung zu entfernen, müssen wir nur dieses Bit entfernen.

Option 1 – Funktion ändern

Um die Schemabindung von dieser Funktion zu entfernen, indem wir sie ändern, können wir den folgenden Code verwenden:

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;

Wir haben lediglich CREATE geändert zu ALTER , und entfernen Sie WITH SCHEMABINDING .

Option 2 – Funktion löschen

Hier ist ein Beispiel für das Löschen der Funktion und das anschließende erneute Erstellen ohne Schemabindung:

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 diesem Fall habe ich die DROP IF EXISTS-Syntax verwendet, die verhindert, dass ein Fehler auftritt, falls die Funktion nicht existiert.