sql >> データベース >  >> RDS >> Sqlserver

SQLServerのユーザー定義関数からSCHEMABINDINGを削除します

    ユーザー定義関数(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を変更するだけでした ALTERWITH 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構文を使用しました。これにより、関数が存在しない場合にエラーが発生するのを防ぎます。


    1. MySQL8.0でrootユーザーにすべての権限を付与する方法

    2. regex_substrの句で接続

    3. OracleDBからMariaDBに移行する方法

    4. Postgresでプリペアドステートメントを使用する方法