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_schema、object_name、column_name、policy_name、expression、enable: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」を参照してください。 -
function_type: リダクションのタイプを指定します。正規表現に基づくリダクションには、DBMS_REDACT.REGEXPまたはDBMS_REDACT.REGEXP_WIDTHのいずれかを使用します。DBMS_REDACT.REGEXPリダクション・タイプを使用した場合、切捨ては行われません。これは、リダクションされる値が列幅よりも広い場合やOracle Call Interfaceの列の幅属性(OCI_ATTR_CHAR_SIZE)が保持されていない場合でも当てはまります。(これは、REGEXP_REPLACESQL演算子が列で使用されているとき同じように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パラメータを省略します。 -
引数
pattern、replace、position、occurrenceおよびmatch_parameterをREGEXP_REPLACESQLファンクションに指定したのとほぼ同じ方法で正規表現パラメータを指定します。REGEXP_REPLACESQLファンクションの詳細は、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_REPLACESQLファンクションのこのファンクションの動作と同じです。詳細は、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パラメータの形式
| 形式 | 説明 |
|---|---|
|
|
任意の桁を検索します。識別されたパターンを、 regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_X この設定によって、一致した任意の桁が 次の設定では、一致した任意の桁が regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_1 |
|
|
先頭6桁および末尾4桁を持つ任意のクレジット・カード(アメリカン・エキスプレス以外)の中央の桁を検索します。識別されたパターンを、 この形式で使用する適切な |
|
|
アメリカン・エキスプレス・クレジット・カード番号以外のクレジット・カード番号に一致します。この形式で使用する適切な |
|
|
アメリカン・エキスプレス・クレジット・カード番号に一致します。この形式で使用する適切な |
|
|
任意の米国の電話番号を検索します。識別されたパターンを、 この形式で使用する必要のある適切な |
|
|
任意の電子メール・アドレスを検索します。識別されたパターンを、 この形式で使用できる適切な
|
|
|
任意のIPアドレスを検索します。識別されたパターンを、 この形式で使用する必要のある適切な |
下の表では、DBMS_REDACT.ADD_POLICYプロシージャでのregexp_replace_stringパラメータで使用できる形式について説明します。
表3-11 regexp_replace_stringパラメータの形式
| 形式 | 説明 |
|---|---|
|
|
実際のデータの各文字を単一の文字 |
|
|
|
|
|
クレジット・カード番号の中央の桁を、 |
|
|
アメリカン・エキスプレスのカード番号以外のクレジット・カード番号の先頭12桁をリダクションします。たとえば、 |
|
|
アメリカン・エキスプレスの番号の先頭10桁をリダクションします。たとえば、 |
|
|
米国の電話番号の最後の7桁を、 |
|
|
電子メール・アドレスを、 |
|
|
電子メール・ドメイン名を、 |
|
|
IPアドレスの最後の3桁を、 |
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: このパターンは通常テキスト・リテラルであり、データ型はCHAR、VARCHAR2、NCHARまたはNVARCHAR2のいずれかになります。パターンには、 512バイトまで入力できます。regexp_patternパラメータの正規表現を記述する方法の詳細は、『Oracle Database SQL言語リファレンス』にあるREGEXP_REPLACESQL関数のpattern引数の説明を参照してください(データ・リダクションがサポートする正規表現の一致は、REGEXP_REPLACESQL関数のものとよく似ているため)。 -
regexp_replace_string: データ型はCHAR、VARCHAR2、NCHARまたは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