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

SQLServerでストアドプロシージャを暗号化する方法

    SQL Serverでは、作成時にストアドプロシージャを暗号化することも、後で暗号化を含めるように変更することもできます。

    T-SQLでストアドプロシージャを作成するには、CREATE PROCEDUREを使用します 構文。暗号化するには、WITH ENCRYPTIONを追加します 引数。

    ALTER PROCEDUREを使用する場合は、同じ引数を使用して既存のプロシージャを暗号化することもできます。 。

    この方法でストアドプロシージャを暗号化すると、プロシージャのテキストが難読化された形式に変換されます。その定義は、カタログビューに直接表示されません。したがって、システムテーブルまたはデータベースファイルにアクセスできないユーザーは、プロシージャの定義を表示できません。

    例1-暗号化されたストアドプロシージャを作成する

    暗号化されたストアドプロシージャを作成する例を次に示します。

    CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
    WITH ENCRYPTION
    AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @catname;
    
    GO
    

    それを暗号化する部分はWITH ENCRYPTIONです。 。暗号化したくない場合は、その引数を削除するだけで済みます。

    例2–結果を表示する

    そのプロシージャを作成した後、sp_helptextを使用すると プロシージャの定義を表示するためのストアドプロシージャ暗号化されていることを通知するメッセージが表示されます。

    EXEC sp_helptext 'usp_GetCatsByName';
    

    結果:

    The text for object 'usp_GetCatsByName' is encrypted.
    

    また、sys.sql_modulesを使用する場合 システムカタログビューがNULLになります。

    SELECT definition 
    FROM sys.sql_modules
    WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');
    

    結果:

    +--------------+
    | definition   |
    |--------------|
    | NULL         |
    +--------------+
    

    プロシージャの定義を取得するために使用するT-SQLメソッドに関係なく、同様の結果が得られます。

    プロシージャのスクリプトを作成しようとすると、AzureDataStudioで表示されるエラーメッセージは次のとおりです。

    No script was returned when scripting as Create on object StoredProcedure
    

    また、SSMS、DBeaver、またはその他のGUIデータベース管理ソフトウェアで表示しようとすると、同様のメッセージが表示されます。

    例3–既存のストアドプロシージャに暗号化を追加する

    既存のストアドプロシージャを暗号化する場合は、ALTER PROCEDUREを使用します 同じ定義で。つまり、最初の例を取り上げて、CREATEを置き換えることができます。 ALTERを使用 。

    ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
    WITH ENCRYPTION
    AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @catname;
    
    GO
    

    これは明らかに、プロシージャの残りの定義が既存の定義とまったく同じであることを前提としています。

    同じ定義を使用していることを確認する最も簡単な方法は、GUIツールを使用して、「変更としてスクリプト」オプションが存在する場合はそれを使用して既存のプロシージャをスクリプト化することです。それ以外の場合は、「Script as Create」を使用して、定義が表示されたら、CREATEを変更します。 ALTERを使用 。

    コマンドラインインターフェイスしかない場合は、sys.sql_modulesにクエリを実行できます。 (前の例のように)既存の定義を取得するためのビュー。次に、定義をコピーしてCREATEを置き換えることができます ALTERを使用 。

    それが済んだら、WITH ENCRYPTIONを追加できます もう一度実行してください。

    例4–ストアドプロシージャから暗号化を削除する

    ALTER PROCEDUREを実行すると、暗号化を削除できます 暗号化オプションのないステートメント。

    ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
    AS
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @catname;
    

    これは、ストアドプロシージャの復号化と同じではないことに注意してください。ここでは、既存の手順を新しい定義に変更するだけです。したがって、ソース管理のどこかに既存のプロシージャのコピーがすでにあることを前提としています。

    例5–ネイティブにコンパイルされたストアドプロシージャ

    暗号化は、ネイティブにコンパイルされたストアドプロシージャではサポートされていません。

    ネイティブにコンパイルされたストアドプロシージャを暗号化しようとすると、次のようになります。

    ALTER PROCEDURE [dbo].[usp_GetCowsByName] @cowname varchar(70)
    WITH SCHEMABINDING, NATIVE_COMPILATION, ENCRYPTION
    AS
    BEGIN ATOMIC WITH (
        TRANSACTION ISOLATION LEVEL = SNAPSHOT, 
        LANGUAGE = N'us_english'
        )  
    SELECT 
        CowId,
        CowName,
        Phone
    FROM dbo.Cows
    WHERE CowName = @cowname
    END;
    

    結果:

    Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3
    The option 'ENCRYPTION' is not supported with natively compiled modules.
    

    この手順の例は、私の記事「SQL Serverでスキーマバインドされたストアドプロシージャを作成する方法」から抜粋したものです。この記事では、ネイティブにコンパイルされたプロシージャでない場合、ストアドプロシージャをスキーマバインドすることもできないことも説明しています。

    重要な注意事項

    SQLServerでのストアドプロシージャの暗号化について知っておくべきことがいくつかあります。

    • DACポートを介してシステムテーブルにアクセスしたり、データベースファイルに直接アクセスしたりできる特権ユーザーは、引き続きストアドプロシージャ(暗号化されていない)定義を表示できます。
    • デバッガーをサーバープロセスに接続できるユーザーは、実行時にメモリから元のプロシージャを取得できます。
    • 暗号化を使用すると、SQLServerレプリケーションの一部としてプロシージャが公開されなくなります。
    • CLRプロシージャは暗号化できません。
    • ネイティブにコンパイルされたプロシージャは暗号化できません。

    1. PostgreSQLでのPi()のしくみ

    2. HikariCPPostgresqlドライバーがJDBCURLを受け入れないと主張

    3. T-SQLを使用してSQLServerのすべてのデータベースを一覧表示する最も簡単な方法

    4. コミットされていない分離レベルの読み取り