3.9 正規表現ベースのリダクション・ポリシーの作成

正規表現ベースのリダクション・ポリシーでは、検索置換モデルに基づいてデータをリダクションできます。

3.9.1 正規表現ベースのリダクション・ポリシーの作成について

正規表現ベースのリダクションでは、リダクションするデータのパターンを検索できます。

たとえば、正規表現を使用して、文字の長さが変化する可能性のある電子メール・アドレスをリダクションできます。これは、文字データのみで使用するように設計されています。検索および置換操作に形式を使用することも、カスタム・パターン形式を作成することもできます。

列内の値のサブセットのリダクションに正規表現は使用できません。REGEXP_REPLACE_STRINGの設定を有効にするには、REGEXP_PATTERN (正規表現パターン)がすべての値に一致する必要があり、REGEXP_REPLACE_STRINGが値を変更する必要があります。

REGEXP_PATTERNが一致しない行では、データ・リダクションはDBMS_REDACT.FULLリダクションを実行します。これにより、REGEXP_PATTERNに誤りがあったために正規表現が列内のすべての値との照合に失敗し、それらの行に対して実際のデータを表示するリスクが軽減されます。

さらに、正規表現の置換操作中に、REGEXP_REPLACE_STRING設定の結果として発生する値への変更がない場合、データ・リダクションはDBMS_REDACT.FULLリダクションを実行します。

3.9.2 正規表現ベースのリダクション・ポリシーを作成する構文

DBMS_REDACT.ADD_POLICYプロシージャのregexp_*パラメータによって、正規表現ベースのリダクション・ポリシーを作成できます。

正規表現ベース完全データ・リダクション・ポリシーを作成する場合のDBMS_REDACT.ADD_POLICYフィールドは次のとおりです。

DBMS_REDACT.ADD_POLICY (
   object_schema           IN VARCHAR2 := NULL, 
   object_name             IN VARCHAR2,
   column_name             IN VARCHAR2 := NULL,
   policy_name             IN VARCHAR2,
   function_type           IN BINARY_INTEGER := NULL,
   expression              IN VARCHAR2,
   enable                  IN BOOLEAN := TRUE,
   regexp_pattern          IN VARCHAR2 := NULL,
   regexp_replace_string   IN VARCHAR2 := NULL,
   regexp_position         IN BINARY_INTEGER := 1,
   regexp_occurrence       IN BINARY_INTEGER := 0,
   regexp_match_parameter  IN VARCHAR2 := NULL);

ここでは次のように指定します:

  • object_schemaobject_namecolumn_namepolicy_nameexpressionenable: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」を参照してください。

  • function_type: リダクションのタイプを指定します。正規表現に基づくリダクションには、DBMS_REDACT.REGEXPまたはDBMS_REDACT.REGEXP_WIDTHのいずれかを使用します。

    DBMS_REDACT.REGEXPリダクション・タイプを使用した場合、切捨ては行われません。これは、リダクションされる値が列幅よりも広い場合やOracle Call Interfaceの列の幅属性(OCI_ATTR_CHAR_SIZE)が保持されていない場合でも当てはまります。(これは、REGEXP_REPLACE SQL演算子が列で使用されているとき同じように4000になります。)

    DBMS_REDACT.REGEXP_WIDTHリダクション・タイプを使用すると、列の幅を超えるリダクション済の値が切り捨てられ、列のOCI幅属性(OCI_ATTR_CHAR_SIZE)が変更されないままになります。

    次のことに注意してください:

    • アプリケーションがOCI_ATTR_CHAR_SIZE属性の値に依存する場合、DBMS_REDACT.REGEXP_WIDTHファンクション・タイプを使用します。たとえば、Oracle OLE DB Providerインタフェースを使用して構築されたアプリケーションは、OCI_ATTR_CHAR_SIZE属性の値に影響を受けやすくなります。DBMS_REDACT.REGEXPをリダクション・タイプとして使用した場合、OCI_ATTR_CHAR_SIZEは常に4000になります。この設定は、Oracle OLE DBベースのアプリケーションに使用される表に対するポリシーのリダクション・タイプとしては不適切になります。Oracle Call Interfaceのパラメータ属性の詳細は、Oracle Call Interface開発者ガイドを参照してください。

    • function_typeパラメータをDBMS_REDACT.REGEXPまたはDBMS_REDACT.REGEXP_WIDTHに設定するときには、DBMS_REDACT.ADD_POLICYプロシージャからのfunction_parametersパラメータを省略します。

    • 引数patternreplacepositionoccurrenceおよびmatch_parameterREGEXP_REPLACE SQLファンクションに指定したのとほぼ同じ方法で正規表現パラメータを指定します。REGEXP_REPLACE SQLファンクションの詳細は、Oracle Database SQL言語リファレンスを参照してください。

  • regexp_pattern: 一致する必要のあるデータの検索パターンを説明します。一致が見つかった場合、Oracle Databaseは、regexp_replace_string設定で指定されたとおりにデータを置換します。詳細は、次の各項を参照してください。

  • regexp_replace_string: データのリダクション方法を指定します。詳細は、次の各項を参照してください。

  • regexp_position: 文字列検索の開始位置を指定します。入力する値は、Oracle Databaseが検索を開始するcolumn_nameデータの文字を示す正の整数です。デフォルトは、1またはDBMS_REDACT.RE_BEGINNING形式で、Oracle Databaseがcolumn_nameデータの最初の文字で検索を開始することを意味します。

  • regexp_occurrence: 検索および置換操作の実行方法を指定します。入力する値は、置換操作の回数を示す正の整数です:

    • 0またはDBMS_REDACT.RE_ALL形式を指定する場合、Oracle Databaseは、一致したすべてのものを置換します。

    • DBMS_REDACT.RE_FIRST形式を指定する場合、Oracle Databaseは、最初に一致したものを置換します。

    • 正の整数nを指定すると、Oracle Databaseは、n番目の一致を置換します。

    出現が1より大きい場合、1番目のパターンが検出された後に続く1文字目から、2番目(以降)の出現を検索します。

  • regexp_match_parameter: ファンクションが持つデフォルトの照合動作を変更できるテキスト・リテラルを指定します。このパラメータの動作は、REGEXP_REPLACE SQLファンクションのこのファンクションの動作と同じです。詳細は、Oracle Database SQL言語リファレンスを参照してください。

    大文字と小文字を区別せずに検索をフィルタするには、RE_CASE_INSENSITIVE形式を指定します。

3.9.3 形式を使用した正規表現ベースのリダクション・ポリシー

DBMS_REDACT.ADD_POLICYプロシージャは、regexp_patternパラメータとregexp_replace_stringパラメータの両方をサポートします。

3.9.3.1 正規表現の形式

正規表現の形式によって、クレジット・カード番号の数を置換する場合などによく使用される表現を表します。

表3-10では、DBMS_REDACT.ADD_POLICYプロシージャでのregexp_patternパラメータで使用できる形式について説明します。

表3-10 regexp_patternパラメータの形式

形式 説明

DBMS_REDACT.RE_PATTERN_ANY_DIGIT

任意の桁を検索します。識別されたパターンを、 regexp_replace_stringパラメータで指定された文字に置き換えます。DBMS_REDACT.RE_PATTERN_ANY_DIGITは、regexp_replace_stringパラメータの次の値でよく使用されます。

regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_X

この設定によって、一致した任意の桁がXの文字に置換されます。

次の設定では、一致した任意の桁が1の文字に置換されます。

regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_1

DBMS_REDACT.RE_PATTERN_CC_L6_T4

先頭6桁および末尾4桁を持つ任意のクレジット・カード(アメリカン・エキスプレス以外)の中央の桁を検索します。識別されたパターンを、 regexp_replace_stringパラメータで指定された文字に置き換えます。

この形式で使用する適切なregexp_replace_string設定はDBMS_REDACT.RE_REDACT_CC_MIDDLE_DIGITSです。これによって、先頭6桁と末尾4桁を実際のデータとして残すすべてのクレジット・カードが検索されます。その後、中央の桁がリダクションされます。

DBMS_REDACT.RE_PATTERN_CCN

アメリカン・エキスプレス・クレジット・カード番号以外のクレジット・カード番号に一致します。この形式で使用する適切なregexp_replace_string設定は、DBMS_REDACT.RE_REDACT_CCNです。最終結果は、末尾4桁以外のすべての桁のリダクションとなります。

DBMS_REDACT.RE_PATTERN_AMEX_CCN

アメリカン・エキスプレス・クレジット・カード番号に一致します。この形式で使用する適切なregexp_replace_string設定は、DBMS_REDACT.RE_REDACT_AMEX_CCNです。最終結果は、末尾5桁以外のすべての桁のリダクションとなります。

DBMS_REDACT.RE_PATTERN_US_PHONE

任意の米国の電話番号を検索します。識別されたパターンを、 regexp_replace_stringパラメータで指定された文字に置き換えます。

この形式で使用する必要のある適切なregexp_replace_string設定はDBMS_REDACT.RE_REDACT_US_PHONE_L7であり、これによって米国の電話番号が検索され、その後、最後の7桁がリダクションされます。

DBMS_REDACT.RE_PATTERN_EMAIL_ADDRESS

任意の電子メール・アドレスを検索します。識別されたパターンを、 regexp_replace_stringパラメータで指定された文字に置き換えます。

この形式で使用できる適切なregexp_replace_string設定は次のとおりです。

RE_REDACT_EMAIL_NAME: 任意の電子メール・アドレスを検索して電子メール・ユーザー名をリダクションします。

RE_REDACT_EMAIL_DOMAIN: 任意の電子メール・アドレスを検索して電子メール・ドメインをリダクションします。

RE_REDACT_EMAIL_ENTIRE: 任意の電子メール・アドレスを検索して電子メール・アドレス全体をリダクションします。

DBMS_REDACT.RE_PATTERN_IP_ADDRESS

任意のIPアドレスを検索します。識別されたパターンを、 regexp_replace_stringパラメータで指定された文字に置き換えます。

この形式で使用する必要のある適切なregexp_replace_string設定はDBMS_REDACT.RE_REDACT_IP_L3であり、これによってIPアドレスにおけるドット付きの10進文字列表現の最後のセクションが、リダクションされたことを示す文字の999に置換されます。

下の表では、DBMS_REDACT.ADD_POLICYプロシージャでのregexp_replace_stringパラメータで使用できる形式について説明します。

表3-11 regexp_replace_stringパラメータの形式

形式 説明

DBMS_REDACT.RE_REDACT_WITH_SINGLE_X

実際のデータの各文字を単一の文字Xで置換します。たとえば、クレジット・カード番号5105 1051 0510 5100XXXX XXXX XXXX XXXXに置換できます。

DBMS_REDACT.RE_REDACT_WITH_SINGLE_1

実際のデータの各桁を1桁の数字1で置換します。たとえば、クレジット・カード番号5105 1051 0510 51001111 1111 1111 1111に置換できます。

DBMS_REDACT.RE_REDACT_CC_MIDDLE_DIGITS

クレジット・カード番号の中央の桁を、RE_PATTERN_CC_L6_T4形式を使用したregexp_patternパラメータの設定で指定したとおりにリダクションします。このリダクションにより、リダクションされる各文字はXに置換されます。たとえば、クレジット・カード番号5105 1051 0510 51005105 10XX XXXX 5100に置換できます。

DBMS_REDACT.RE_REDACT_CCN

アメリカン・エキスプレスのカード番号以外のクレジット・カード番号の先頭12桁をリダクションします。たとえば、4012888888881881************1881にリダクションされます。

DBMS_REDACT.RE_REDACT_AMEX_CCN

アメリカン・エキスプレスの番号の先頭10桁をリダクションします。たとえば、378282246310005**********10005にリダクションされます。

DBMS_REDACT.RE_REDACT_PHONE_L7

米国の電話番号の最後の7桁を、RE_PATTERN_US_PHONE形式を使用したregexp_patternパラメータの設定で指定したとおりにリダクションします。このリダクションにより、リダクションされる各文字はXに置換されます。この設定はハイフンで連結された電話番号にのみ適用され、空白を含む電話番号には適用されません。たとえば、電話番号415-555-0100は、415-XXX-XXXXに置換できます。

DBMS_REDACT.RE_REDACT_EMAIL_NAME

電子メール・アドレスを、RE_PATTERN_EMAIL_ADDRESS形式を使用したregexp_patternパラメータの設定で指定したとおりにリダクションします。このリダクションにより、電子メール・ユーザー名は4つの文字xに置換されます。たとえば、電子メール・アドレスpsmith@example.comは、xxxx@example.comに置換されます。

DBMS_REDACT.RE_REDACT_EMAIL_DOMAIN

電子メール・ドメイン名を、RE_PATTERN_EMAIL_ADDRESS形式を使用したregexp_patternパラメータの設定で指定したとおりにリダクションします。このリダクションにより、ドメインは5つの文字xに置換されます。たとえば、電子メール・アドレスpsmith@example.comは、psmith@xxxxx.comに置換できます。

DBMS_REDACT.RE_REDACT_IP_L3

IPアドレスの最後の3桁を、RE_PATTERN_IP_ADDRESS形式を使用したregexp_patternパラメータの設定で指定したとおりにリダクションします。たとえば、IPアドレス192.0.2.254は、無効なIPアドレスである192.0.2.999に置換されます。

3.9.3.2 例: 形式を使用した正規表現リダクション・ポリシー

DBMS_REDACT.ADD_POLICYプロシージャによって、形式を使用した正規表現リダクション・ポリシーを作成できます。

例3-7では、正規表現形式を使用してクレジット・カード番号をリダクションする方法を示します。

例3-7 正規表現によるデータ・リダクションの文字値

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema          => 'mavis', 
   object_name            => 'cust_info', 
   column_name            => 'cc_num',
   policy_name            => 'redact_cust_cc_nums', 
   function_type          => DBMS_REDACT.REGEXP,
   expression             => '1=1',
   regexp_pattern         => DBMS_REDACT.RE_PATTERN_CC_L6_T4,
   regexp_replace_string  => DBMS_REDACT.RE_REDACT_CC_MIDDLE_DIGITS,
   regexp_position        => DBMS_REDACT.RE_BEGINNING,
   regexp_occurrence      => DBMS_REDACT.RE_FIRST,
   regexp_match_parameter => DBMS_REDACT.RE_CASE_INSENSITIVE,
   policy_description     => 'Regular expressions to redact credit card numbers',
   column_description     => 'cc_num contains customer credit card numbers');
END;
/

問合せおよびリダクションされた結果:

SELECT cc_num FROM mavis.cust_info;

CC_NUM
-------
401288XXXXXX1881
411111XXXXXX1111
555555XXXXXX1111
511111XXXXXX1118

3.9.4 カスタム正規表現リダクション・ポリシー

データ・リダクション・ポリシーで正規表現をカスタマイズできます。

3.9.4.1 カスタム正規表現の設定

Oracle Data Redactionには、正規表現を使用するポリシーを構成するための、特別な設定が用意されています。

カスタム正規表現リダクション・ポリシーを作成するには、DBMS_REDACT.ADD_POLICYプロシージャで次のパラメータを使用します。

  • regexp_pattern: このパターンは通常テキスト・リテラルであり、データ型はCHARVARCHAR2NCHARまたはNVARCHAR2のいずれかになります。パターンには、 512バイトまで入力できます。regexp_patternパラメータの正規表現を記述する方法の詳細は、『Oracle Database SQL言語リファレンス』にあるREGEXP_REPLACE SQL関数のpattern引数の説明を参照してください(データ・リダクションがサポートする正規表現の一致は、REGEXP_REPLACE SQL関数のものとよく似ているため)。

  • regexp_replace_string: データ型はCHARVARCHAR2NCHARまたはNVARCHAR2のいずれかになります。regexp_replace_stringには、最大500個の部分正規表現への後方参照を\nという書式で指定でき、nは、1から9の数値です。regexp_replace_string設定にバックスラッシュ(\)を含める場合、その前にエスケープ文字(これもバックスラッシュ)を付ける必要があります。たとえば、一致したパターンを文字どおり\2に置換するには(それを一致したパターンで2番目に一致した部分正規表現に置換するのではない場合)、regexp_replace_string設定に\\2を入力します。詳細は、Oracle Database SQL言語リファレンスを参照してください。

関連項目:

その他のDBMS_REDACT.ADD_POLICYパラメータの詳細は、DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文を参照してください。

3.9.4.2 例: カスタム正規表現リダクション・ポリシー

DBMS_REDACT.ADD_POLICYプロシージャのregexp*パラメータによって、カスタム正規表現リダクション・ポリシーを作成できます。

例3-8では、emp_id列データをリダクションするための正規表現の使用方法を示します。次の例では、regexp_patternパラメータとregexp_replace_stringパラメータが組み合されて、最初に9桁のパターンが検索されます。参照用に、それらは最初の3桁、次の2桁、最後の4桁を含む3つのグループに分割されます。その後、最初の5桁が、元のパターンで検索された3番目のグループ(最後の4桁)と連結されたXXXXXに置換されます。

例3-8 正規表現を使用した部分的にリダクションされるデータ・リダクション

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema          => 'mavis', 
   object_name            => 'cust_info', 
   column_name            => 'emp_id',
   policy_name            => 'redact_cust_ids', 
   function_type          => DBMS_REDACT.REGEXP,
   expression             => '1=1',
   regexp_pattern         => '(\d\d\d)(\d\d)(\d\d\d\d)',
   regexp_replace_string  => 'XXXXX\3',
   regexp_position        => 1,
   regexp_occurrence      => 0,
   regexp_match_parameter => 'i',
   policy_description     => 'Redacts employee IDs using regular expression',
   column_description     => 'emp_id contains employee ID numbers');
END;
/

問合せおよびリダクションされた結果:

SELECT emp_id FROM mavis.cust_info;

EMP_ID
------------
XXXXX1234
XXXXX5678