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.