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プロシージャは暗号化できません。
- ネイティブにコンパイルされたプロシージャは暗号化できません。