WRAP 関数 - DDL ステートメントの難読化

WRAP 関数は、判読可能な DDL ステートメントを、難読化された DDL ステートメントに変換します。

構文

難読化 DDL ステートメントでは、プロシージャー・ロジックに含まれる知的財産を簡単には抽出できないように、ロジックと組み込み SQL ステートメントがごちゃまぜにされます。 DDL ステートメントが外部ルーチン定義に相当する場合は、パラメーター・リストの後に続く部分がエンコードされます。

構文図を読む構文図をスキップするDBMS_DDL.WRAP(object-definition-string )

パラメーター

object-definition-string
DDL ステートメント・テキストを含んだ CLOB(2M) タイプのストリング。以下のいずれかの DDL ステートメント・テキストが可能です (SQLSTATE 5UA0O)。
  • CREATE PROCEDURE
  • CREATE FUNCTION
  • CREATE PACKAGE (PL/SQL)
  • CREATE PACKAGE BODY (PL/SQL)
  • CREATE TRIGGER
  • CREATE VIEW
  • ALTER MODULE ADD FUNCTION
  • ALTER MODULE PUBLISH FUNCTION
  • ALTER MODULE ADD PROCEDURE
  • ALTER MODULE PUBLISH PROCEDURE
結果は、入力ステートメントのエンコード・バージョンを含んだ CLOB(2M) タイプのストリングになります。 エンコードの構成は、次のようになります。まず、元のステートメントの接頭部のルーチン・シグニチャー (トリガー、ビュー、またはパッケージの名前) までがあり、その後にキーワード WRAPPED が続きます。 このキーワードの後に、この関数を実行するアプリケーション・サーバーに関する情報が続きます。 この情報は pppvvrrm の形式をとります。
  • ppp には、製品を Db2® と特定するために文字 SQL が使用されます。
  • vv は、2 桁のバージョン ID です (例えば「09」)。
  • rr は、2 桁のリリース ID です (例えば「07」)。
  • m は、1 文字の修正レベル ID です (例えば「0」)。
例えば、バージョン 9.7 のフィックスパック 2 は「SQL09072」と示されます。 このアプリケーション・サーバー情報の後に、文字 (a から z、および A から Z)、数字 (0 から 9)、下線、コロンから成るストリングが続きます。 難読化後も判読可能のままの接頭部の後にある入力ステートメントに対する構文検査は行われません。
エンコードされた DDL ステートメントは通常、平文形式のステートメントよりも長くなります。 結果が SQL ステートメントの最大長を超えた場合は、エラーが発生します (SQLSTATE 54001)。
注: ステートメントのエンコードは、内容を難読化することを意図したものであり、強い暗号化の 1 形式と考えるべきではありません。

許可

DBMS_DDL モジュールに対する EXECUTE 特権。

  • 週 40 時間労働として時間給から年間給与を計算する関数の難読化バージョンを作成します。
    
    VALUES(DBMS_DDL.WRAP('CREATE FUNCTION ' ||
                        'salary(wage DECFLOAT) ' ||
                        'RETURNS DECFLOAT ' ||
                        'RETURN wage * 40 * 52'))
    このステートメントの結果は、例えば次の形式のものになります。
    
    CREATE FUNCTION salary(wage DECFLOAT) WRAPPED SQL09072 obfuscated-text
  • 複雑なデフォルトを設定するトリガーの難読化形式を作成します。
    VALUES(DBMS_DDL.WRAP('CREATE OR REPLACE TRIGGER ' ||
                          'trg1 BEFORE INSERT ON emp ' ||
                          'REFERENCING NEW AS n ' ||
                          'FOR EACH ROW ' ||
                          'WHEN (n.bonus IS NULL) ' ||
                          'SET n.bonus = n.salary * .04'))
    
    このステートメントの結果は、例えば次の形式のものになります。
    
    CREATE OR REPLACE TRIGGER trg1 WRAPPED SQL09072 obfuscated-text