SQL Serverでユーザー定義関数を作成する場合、暗号化するオプションがあります。
T-SQLでユーザー定義関数を作成するには、CREATE FUNCTIONを使用します 構文。暗号化するには、WITH ENCRYPTIONを追加します 引数。
ALTER FUNCTIONを使用する場合は、同じ引数を使用して既存の関数を暗号化することもできます。 。
この方法でユーザー定義関数を暗号化すると、関数のテキストが難読化された形式に変換されます。関数の定義は、カタログビューに直接表示されません。したがって、システムテーブルまたはデータベースファイルにアクセスできないユーザーは、関数の定義を表示できません。
例1-暗号化を使用したインラインテーブル値関数
暗号化されたユーザー定義のテーブル値関数を作成する例を次に示します。
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
RETURNS TABLE
WITH ENCRYPTION
AS
RETURN (
SELECT
CatId,
CatName,
Phone
FROM dbo.Cats
WHERE CatName = @CatName
);
GO
それを暗号化する部分はWITH ENCRYPTIONです。 。暗号化したくない場合は、その引数を削除するだけで済みます。
その関数を作成した後、sys.sql_modulesを使用すると その定義を表示するためのシステムカタログビュー、私はNULLを取得します。
SELECT definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
結果:
+--------------+ | definition | |--------------| | NULL | +--------------+
関数のスクリプトを作成しようとすると、AzureDataStudioで表示されるエラーメッセージは次のとおりです。
No script was returned when scripting as Create on object UserDefinedFunction
また、SSMS、DBeaver、またはその他のGUIデータベース管理ソフトウェアで表示しようとすると、同様のメッセージが表示されます。
例2–暗号化を使用したマルチステートメントテーブル値関数
これは、前の機能と同じことを行うマルチステートメントTVFです。マルチステートメントTVFは、インラインTVFとは異なる構文を持っています。マルチステートメントTVFでは、戻り変数を指定した後に暗号化オプションを設定します。
CREATE FUNCTION [dbo].[udf_CatsByName_MSTVF]( @CatName varchar(70) )
RETURNS @cats TABLE (
CatId int,
CatName varchar(70),
Phone varchar(10)
)
WITH ENCRYPTION
AS
BEGIN
INSERT INTO @cats
SELECT
CatId,
CatName,
Phone
FROM dbo.Cats
WHERE CatName = @CatName;
RETURN;
END;
GO
例3–暗号化を使用したスカラー関数
そして、暗号化されたスカラー関数の例を次に示します。
CREATE FUNCTION dbo.discountPrice(
@price DECIMAL(12,2),
@discount DECIMAL(12,2)
)
RETURNS DECIMAL (12,2)
WITH ENCRYPTION
AS
BEGIN
RETURN @price * (1 - @discount);
END;
GO
例4–既存の機能に暗号化を追加する
既存の関数を暗号化する場合は、ALTER FUNCTIONを使用します 同じ定義で。つまり、最初の例を取り上げて、CREATEを置き換えることができます。 ALTERを使用 。
ALTER FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
RETURNS TABLE
WITH ENCRYPTION
AS
RETURN (
SELECT
CatId,
CatName,
Phone
FROM dbo.Cats
WHERE CatName = @CatName
);
GO
これは明らかに、関数の残りの定義が既存の関数とまったく同じであることを前提としています。
同じ定義を使用していることを確認する最も簡単な方法は、GUIツールを使用して、既存の関数が存在する場合は「変更としてスクリプト」オプションを使用してスクリプトを作成することです。それ以外の場合は、「Script as Create」を使用して、定義が表示されたら、CREATEを変更します。 ALTERを使用 。
コマンドラインインターフェイスしかない場合は、sys.sql_modulesにクエリを実行できます。 (前の例のように)既存の定義を取得するためのビュー。次に、定義をコピーしてCREATEを置き換えることができます ALTERを使用 。
それが済んだら、WITH ENCRYPTIONを追加できます もう一度実行してください。
例5–複数の引数の追加
複数の引数をコンマ区切りのリストとして指定できます。たとえば、暗号化を使用する場合は スキーマバインディングを指定する場合は、これらをコンマ区切りのリストとして追加する必要があります。
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
RETURNS TABLE
WITH SCHEMABINDING, ENCRYPTION
AS
RETURN (
SELECT
CatId,
CatName,
Phone
FROM dbo.Cats
WHERE CatName = @CatName
);
GO
を含むテーブルを返します。
つまり、WITHのみを指定します 一度–引数ごとに繰り返す必要はありません。
重要な注意事項
SQLServerでのユーザー定義関数の暗号化について知っておくべきことがいくつかあります。
- DACポートを介してシステムテーブルにアクセスしたり、データベースファイルに直接アクセスしたりできる特権ユーザーは、引き続き関数の(暗号化されていない)定義を表示できます。
- デバッガーをサーバープロセスに接続できるユーザーは、実行時にメモリから元のプロシージャを取得できます。
- 暗号化を使用すると、SQLServerレプリケーションの一部として関数が公開されなくなります。
- CLR関数は暗号化できません。