Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Supprimer SCHEMABINDING d'une fonction définie par l'utilisateur dans SQL Server

Le but de la liaison de schéma à une fonction définie par l'utilisateur (UDF) est de garantir que les objets de base référencés dans l'UDF ne peuvent pas être modifiés d'une manière qui affecterait la définition de la fonction.

C'est très bien, tant que vous n'avez pas besoin d'apporter de modifications aux objets sous-jacents. Mais que se passe-t-il si vous devez apporter des modifications ?

Vous pouvez supprimer la liaison de schéma d'une UDF, apporter les modifications à l'objet ou aux objets de base, puis réappliquer la liaison de schéma.

Il existe deux manières de supprimer la liaison d'une fonction définie par l'utilisateur à ses objets de base :

  • Modifiez la fonction afin que sa définition ne spécifie plus la liaison de schéma.
  • Supprimez la fonction (puis recréez-la sans liaison de schéma si nécessaire).

Exemple de fonction liée à un schéma

Tout d'abord, voici un exemple de fonction liée au 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;

Nous savons que c'est une fonction liée au schéma car elle contient WITH SCHEMABINDING dans sa définition. Pour supprimer la liaison de schéma, il nous suffit de supprimer ce bit.

Option 1 - Modifier la fonction

Pour supprimer la liaison de schéma de cette fonction en la modifiant, nous pouvons utiliser le code suivant :

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;

Tout ce que nous avons fait a été de changer CREATE à ALTER , et supprimez WITH SCHEMABINDING .

Option 2 - Supprimer la fonction

Voici un exemple de suppression de la fonction, puis de la recréer sans liaison de schéma :

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;

Dans ce cas, j'ai utilisé la syntaxe DROP IF EXISTS, qui évite qu'une erreur ne se produise si la fonction n'existe pas.