ユーザー定義関数(UDF)をスキーマバインドする目的は、UDFで参照されるベースオブジェクトが、関数の定義に影響を与えるような方法で変更されないようにすることです。
基になるオブジェクトに変更を加える必要がない限り、これは問題ありません。しかし、変更を加える必要がある場合はどうなりますか?
UDFからスキーマバインディングを削除し、ベースオブジェクトに変更を加えてから、スキーマバインディングを再適用できます。
ユーザー定義関数のベースオブジェクトへのバインドを削除するには、次の2つの方法があります。
- 関数を変更して、その定義でスキーマバインディングが指定されないようにします。
- 関数を削除します(必要に応じて、スキーマバインディングなしで関数を再作成します)。
スキーマバインド関数の例
まず、スキーマにバインドされた関数の例を次に示します。
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;
WITH SCHEMABINDINGが含まれているため、スキーマにバインドされた関数であることがわかります。 その定義で。スキーマバインディングを削除するには、そのビットを削除するだけです。
オプション1-機能を変更する
この関数を変更してスキーマバインディングを削除するには、次のコードを使用できます。
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;
CREATEを変更するだけでした ALTER 、WITH SCHEMABINDINGを削除します 。
オプション2–関数を削除
関数を削除してから、スキーマをバインドせずに再作成する例を次に示します。
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;
この場合、DROP IF EXISTS構文を使用しました。これにより、関数が存在しない場合にエラーが発生するのを防ぎます。