プライマリ・コンテンツに移動
Oracle® Database Advanced Securityガイド
12cリリース1 (12.1)
B71313-13
目次へ移動
目次
索引へ移動
索引

前
次

第10章 Oracle Data Redactionポリシーの構成

Oracle Data Redactionポリシーでは、表の列タイプおよび使用するリダクションのタイプに応じて、列でデータをどのようにリダクションするかを定義します。

内容は次のとおりです。

Oracle Data Redactionポリシーについて

Oracle Data Redactionポリシーでは、表またはビューでリダクションが発生する条件を定義します。

データ・リダクション・ポリシーには、次のような特徴があります。

  • データ・リダクション・ポリシーは、実行するリダクションの種類、リダクションの出現方法およびリダクションを実行するタイミングを定義します。Oracle Databaseは、実行時に、データがアプリケーションに戻される直前にリダクションを実行します。

  • データ・リダクション・ポリシーでは、値の完全なリダクション、部分的なリダクション、ランダムなリダクションが可能です。さらに、テスト環境でポリシーをテストする場合には、データをまったくリダクションしないようにデータ・リダクション・ポリシーを定義することもできます。

  • データ・リダクション・ポリシーは、ポリシー式がTRUEまたはFALSEのどちらを返すかに基づいて、異なるアプリケーション・ユーザーにリダクションされたデータまたは実際のデータのいずれかの表示を許可するポリシー式で定義できます。ポリシー式の評価のブール結果がTRUEであると、リダクションが実行されます。セキュリティ上の理由から、ポリシー式で使用できる関数および演算子は、SYS_CONTEXTなどの少数に限定されています。ユーザー作成関数は使用できません。ポリシー式では、SYS_SESSION_ROLES名前空間とSYS_CONTEXT関数を組み合せて使用し、有効なロールを確認できます。

表10-1に、DBMS_REDACTパッケージのプロシージャを示します。

表10-1 DBMS_REDACTプロシージャ

プロシージャ 説明

DBMS_REDACT.ADD_POLICY

データ・リダクション・ポリシーを表またはビューに追加します

DBMS_REDACT.ALTER_POLICY

データ・リダクション・ポリシーを変更します

DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES

指定されたデータ型の完全にリダクションされた値をグローバルに更新します。データベース・インスタンスを再起動すると、更新された値を使用できます。

DBMS_REDACT.ENABLE_POLICY

データ・リダクション・ポリシーを有効化します

DBMS_REDACT.DISABLE_POLICY

データ・リダクション・ポリシーを無効化します

DBMS_REDACT.DROP_POLICY

データ・リダクション・ポリシーを削除します

関連項目:

  • DBMS_REDACT PL/SQLパッケージの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

  • Oracle Enterprise Manager Cloud Controlを使用してOracle Data Redactionのポリシーと形式を作成して管理する方法の詳細は、「Oracle Enterprise ManagerでのOracle Data Redactionの使用」を参照してください。

Oracle Data Redactionポリシーを作成できるユーザーは?

データ・リダクションには高機密データの保護が伴うため、信頼できるユーザーのみがOracle Data Redactionポリシーを作成する必要があります。

リダクション・ポリシーを作成するには、DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限が必要です。ユーザーに付与された権限を確認するには、DBA_SYS_PRIVSデータ・ディクショナリ・ビューに問い合せます。

ポリシーで保護される基礎となる表やビューにアクセスする場合、権限は一切必要ありません。

データ・リダクション・ポリシーの計画

Oracle Data Redactionポリシーを作成する前に、サイトのニーズに最も適したデータ・リダクション・ポリシーを計画する必要があります。

  1. DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限が付与されていることを確認してください。

  2. リダクションする表またはビューの列のデータ型を決定します。

  3. この列がOracle Virtual Private Database (VPD) 行フィルタ処理条件で使用されていないことを確認してください。つまり、VPDポリシー関数によって生成されるVPD述語の一部であってはなりません。

  4. 実行するリダクションのタイプ(完全、ランダム、部分、正規表現またはなし)を決定します。

  5. データ・リダクション・ポリシーを適用するユーザーを決定します。

  6. この情報に基づいて、DBMS_REDACT.ADD_POLICYプロシージャを使用てデータ・リダクション・ポリシーを作成します。

  7. 複数列のリダクションの説明に従って、追加の列をリダクションするようにポリシーを構成します。

データ・リダクション・ポリシーは、作成後、自動的に有効化され、データをリダクションできるようになります。

DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文

データ・リダクション・ポリシーを作成するには、DBMS_REDACT.ADD_POLICYプロシージャを使用する必要があります。

DBMS_REDACT.ADD_POLICYプロシージャの完全な構文は次のとおりです。

DBMS_REDACT.ADD_POLICY (
 object_schema               IN VARCHAR2 := NULL,
 object_name                 IN VARCHAR2 := NULL,
 policy_name                 IN VARCHAR2, 
 policy_description          IN VARCHAR2 := NULL,
 column_name                 IN VARCHAR2 := NULL,
 column_description          IN VARCHAR2 := NULL,
 function_type               IN BINARY_INTEGER := DBMS_REDACT.FULL,
 function_parameters         IN VARCHAR2 := 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: データ・リダクション・ポリシーを適用するオブジェクトのスキーマを指定します。この設定を省略(またはNULLを入力)する場合、Oracle Databaseは現在のユーザー名を使用します。ここでの「現在のユーザー」の意味は、DBMS_REDACT.ADD_POLICYプロシージャを呼び出す場所によって変わる場合があることに注意してください。

    たとえば、ユーザーmpikeは、ユーザーfbrownに、mpikeのスキーマ内のmpike.protect_dataという名前の定義者権限のPL/SQLパッケージに対するEXECUTE権限を付与すると仮定します。このパッケージ内から、mpikeは、protect_cust_dataと呼ばれるプロシージャをコード化し、これにより、DBMS_REDACT.ADD_POLICYが呼び出されます。ユーザーmpikeは、object_schemaパラメータをNULLに設定しました。

    fbrownmpike.protect_dataパッケージのprotect_cust_dataプロシージャを呼び出すと、Oracle Databaseは、fbrownのスキーマのcust_dataオブジェクトではなく、mpikeスキーマのオブジェクトcust_dataの周りにデータ・リダクション・ポリシーを定義しようとします。

  • object_name: データ・リダクション・ポリシーが適用する表またはビューの名前を指定します。

  • policy_name: 作成するポリシーの名前を指定します。この名前は、データベース・インスタンス内で必ず一意である必要があります。REDACTION_POLICIESデータ・ディクショナリ・ビューのPOLICY_NAME列を問い合せることで、既存のデータ・リダクション・ポリシーのリストを検索できます。

  • policy_description: ポリシーの目的についての簡単な説明を指定します。

  • column_name: データをリダクションする必要がある列を指定します。次の点に注意してください。

    • データ・リダクション・ポリシーを複数の列に適用できます。データ・リダクション・ポリシーを複数の列に適用する場合、DBMS_REDACT.ADD_POLICYを使用してポリシーを作成した後、DBMS_REDACT.ALTER_POLICYプロシージャを必要な回数実行して、必要な残りの列それぞれをポリシーに追加します。Oracle Data Redactionポリシーの変更を参照してください。

    • 表またはビューに定義できるポリシーは1つだけです。ただし、表に新しいビューを作成できるため、2つ目のリダクション・ポリシーをこの新しいビューに定義することで、この新しいビューに対して問合せを発行するときに、異なる方法で列をリダクションできます。指定された列のリダクション方法を決める際、Oracle Databaseは、ビュー・チェーンの最初のビューのポリシーを使用します。

    • 列を指定しない場合(たとえば、NULLを入力)、いずれの列もポリシーによるリダクションは行われません。これにより、ユーザー自身のポリシーを作成して配置できるようになるため、後で準備ができたときに列の仕様を追加することができます。

    • Oracle Virtual Private Database (VPD)の行フィルタ処理条件で現在使用されている列は使用しないでください。つまり、列は、VPDポリシー関数によって生成されるVPD述語の一部にすることはできません。(VPDでデータ・リダクションを使用する方法の詳細は、Oracle Data RedactionとOracle Virtual Private Databaseを参照してください。)

    • 仮想列にデータ・リダクション・ポリシーを定義することはできません。また、任意の仮想列のSQL式に関連する列にデータ・リダクション・ポリシーを定義することもできません。

  • column_description: リダクションする列の簡単な説明を指定します。

  • function_type: リダクションのタイプを設定するファンクションを指定します。詳細は、次の各項を参照してください。

    function_typeパラメータを省略する場合、デフォルトのリダクションfunction_type設定は、DBMS_REDACT.FULLです。

  • function_parameters: 部分リダクションのために列のリダクションをどのように表示するかを指定します。部分リダクション・ポリシーを作成する構文を参照してください。

  • expression: ポリシーの適用方法を決定するブール型SQL式を指定します。リダクションは、ポリシー式がTRUEと評価された場合にのみ実行されます。データ・リダクション・ポリシーの条件を定義する式の使用を参照してください。

  • enable: TRUEに設定すると、作成時にポリシーが有効になります。FALSEに設定すると、無効化されたポリシーとしてポリシーを作成します。デフォルトはTRUEです。ポリシーを作成した後、そのポリシーを無効化または有効化できます。次の項を参照してください。

  • regexp_patternregexp_replace_stringregexp_positionregexp_positionregexp_occurrenceregexp_match_parameter: 正規表現を使用してデータを完全に、または部分的にリダクションできます。実際のデータregexp_patternに一致するものがない場合は完全リダクションが実行されるので、regexp_patternを指定するときは注意してください。列のすべての値が、使用している正規表現のセマンティクスに一致しているか確認します。詳細は、正規表現ベースのリダクション・ポリシーを作成する構文を参照してください。

データ・リダクション・ポリシーの条件を定義する式の使用

DBMS_REDACT.ADD_POLICYプロシージャのexpressionパラメータには、ポリシーが適用される条件を指定します。

内容は次のとおりです。

データ・リダクション・ポリシーでの式の使用について

DBMS_REDACT.ADD_POLICYおよびDBMS_REDACT.ALTER_POLICYexpressionパラメータには、リダクションを有効化するためにTRUEに評価される必要があるブール式を定義します。

この式は次のいずれかのファンクションに基づいている必要があります。

  • 指定された名前領域を使用するSYS_CONTEXTSYS_CONTEXTのデフォルトの名前空間は、SESSION_USERおよびCLIENT_IDENTIFIERなどの値を含むUSERENVです。(この関数の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。)使用できるもう一つの名前空間は、各ロールの属性を含むSYS_SESSION_ROLES名前空間です。

  • 次のOracle Application Expressファンクション:

    • APEX_UTIL.GET_SESSION_STATEファンクションのラッパーであるV

    • NVAPEX_UTIL.GET_NUMERIC_SESSION_STATE関数のラッパーです。

    これらのAPEX_UTILパッケージ・ファンクションの詳細は、『Oracle Application Express APIリファレンス』を参照してください。

  • 『Oracle Label Security管理者ガイド』で説明されている、OLS_LABEL_DOMINATESファンクションは、LBACSYS.OLS_LABEL_DOMINATESファンクションのラッパーです。

式を記述する場合は次のガイドラインに従ってください。

  • 使用できる演算子は、=!=><>=<=のみです。

  • リダクションの際に式はTRUEに評価される必要があるので、NULLと比較する場合には注意が必要です。SQLでは、値NULLは定義されていないため、NULLと比較すると、FALSEを返す傾向があります。

  • expressionパラメータでユーザー作成ファンクションを使用することはできません。

ユーザーSYSおよびEXEMPT REDACTION POLICY権限を持つユーザーでは、すべてのデータ・リダクション・ポリシーがバイパスされるため、問合せの結果はリダクションされないことに注意してください。データ・リダクション・ポリシーから除外されるユーザーの詳細は、次の項を参照してください。

ユーザー環境に基づくリダクション・ポリシーの適用

セッション・ユーザー名またはクライアント識別子などユーザーの環境に基づいて、データ・リダクション・ポリシーを適用できます。

  • DBMS_REDACT.ADD_POLICY expressionパラメータでSYS_CONTEXTファンクションのUSERENV名前空間を使用して、ユーザー環境に基づいてポリシーを適用します。

たとえば、セッション・ユーザー名psmithにのみポリシーを適用するには、次のようにします。

expression  => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''PSMITH'''

関連項目:

SYS_CONTEXTファンクションで使用できるネームスペースの詳細は、Oracle Database SQL言語リファレンスを参照してください。

データベース・ロールに基づくリダクション・ポリシーの適用

DBAロールなどのデータベース・ロールに基づいて、データ・リダクション・ポリシーを適用できます。

  • SYS_CONTEXTファンクションのSYS_SESSION_ROLES名前空間を使用して、ユーザー・ロールに基づいてポリシーを適用します。

    この名前空間には、各ロールの属性が含まれます。指定されたロールが、問合せを行ったアプリケーション・ユーザーに対して有効化されている場合、属性の値はTRUEで、ロールが有効化されていない場合、属性の値はFALSEです。

たとえば、スーパーバイザのみに実際のデータの表示を許可するとします。次の例では、DBMS_REDACT.ADD_POLICY expressionパラメータを使用してポリシーを設定し、supervisorロールが有効化されているアプリケーション・ユーザーには実際のデータを表示し、他のすべてのアプリケーション・ユーザーにはデータをリダクションする方法を示します。

expression  => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''SUPERVISOR'') = ''FALSE'''

Oracle Label Securityラベル優位に基づくリダクション・ポリシーの適用

Oracle Label Securityラベルの優位性に基づきデータ・リダクション・ポリシーを適用する条件を設定できます。

注意:

この機能は、Oracle Database 12cリリース1 (12.1.0.2)以降で使用可能です。

  • パブリック・スタンドアロン・ファンクションOLS_LABEL_DOMINATESを使用して、セッション・ラベルの優位性を確認します。このファンクションは、指定したpolicy_name値のセッション・ラベルがlabelパラメータで指定したラベルよりも優位または同位の場合、1 (TRUE)を戻します。それ以外の場合は0 (FALSE)を戻します。

たとえば、ポリシーhr_ols_polのセッション・ラベルがラベルhsよりも優位でも同位でもない場合のみデータ・リダクション・ポリシーを適用するには、次のように指定します。

expression  => 'OLS_LABEL_DOMINATES (''hr_ols_pol'',''hs'') = 0'

Application Expressセッション・ステートに基づくリダクション・ポリシーの適用

Oracle Application Express (APEX)セッション・ステートに基づいて、データ・リダクション・ポリシーを適用できます。

  • DBMS_REDACT.ADD_POLICY expressionパラメータで、次に示すパブリックApplication Express APIのいずれかを使用して、Oracle Application Expressのセッション・ステートに基づいてポリシーを適用します。

    • VAPEX_UTIL.GET_SESSION_STATEファンクションのシノニムです。

    • NVAPEX_UTIL.GET_NUMERIC_SESSION_STATEファンクションのシノニムです。

たとえば、G_JOBというアプリケーション項目の値がCLERKとなったときにリダクションを発生させるようにDBMS_REDACT.ADD_POLICYexpressionパラメータを設定するには次のようにします。

expression => 'V(''APP_USER'') != ''mavis@example.com'' or V(''APP_USER'') is null'

たとえば、これらのようなファンクションを使用することにより、APEXアプリケーションのセッション・ステートに格納されているジョブまたは権限ロールに基づいてデータをリダクションできます。

問合せユーザーがAPEXアプリケーションのコンテキストにないとき(問合せがAPEXフレームワーク外、たとえばSQL*Plusから直接発行されたとき)にリダクションを発生させる場合は、次のようにIS NULL句を使用します。このポリシー式を使用すると、mavisというユーザーの問合せがAPEXアプリケーション内部から発行された場合にのみ、このユーザーに実際のデータが表示されます。それ以外の場合、問合せ結果はリダクションされます。

関連項目:

Oracle Application Express APIリファレンス

すべてのユーザーへのリダクション・ポリシーの適用

フィルタリングを使用しなければ、コンテキストに関係なくポリシーを任意のユーザーに適用できます。

ただし、ユーザーSYSおよびEXEMPT REDACTION POLICY権限を持つユーザーは常にOracle Data Redactionポリシーから除外されることに注意してください。

  • SYS以外のユーザーまたはEXEMPT REDACTION POLICY権限が付与されていないユーザーにポリシーを適用するには、TRUEに評価されるDBMS_REDACT.ADD_POLICY expressionパラメータを記述します。

例:

expression  => '1=1'

完全データ・ポリシーの作成と完全リダクション値の変更

完全リダクション・ポリシーを作成して、データ列のすべての内容をリダクションできます。また、必要に応じて、デフォルトの完全リダクション値を変更できます。

内容は次のとおりです。

完全リダクション・ポリシーの作成

完全データ・リダクション・ポリシーでは、データ列のすべての内容がリダクションされます。

内容は次のとおりです。

完全データ・リダクション・ポリシーの作成について

列のすべてのデータをリダクションするリダクション・ポリシーを設定するには、function_typeパラメータをDBMS_REDACT.FULLに設定する必要があります。

デフォルトでは、NUMBERデータ型の列はゼロ(0)に置き換えられ、文字データ型の列は空白1つに置き換えられます( )。DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを使用することにより、このデフォルトを変更できます。

関連項目:

デフォルトの完全リダクション値を変更する場合には、デフォルトの完全データ・リダクション値の変更を参照してください。

完全リダクション・ポリシーを作成する構文

DBMS_REDACT.ADD_POLICYプロシージャでは、完全リダクション・ポリシーを作成できます。

完全データ・リダクション・ポリシーを作成する場合の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);

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

例: 完全リダクション・ポリシー

DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、完全リダクション・ポリシーを作成できます。

例10-1に、HR.EMPLOYEES表のCOMMISSION_PCT列にすべての値の完全なリダクションを使用する方法を示します。式パラメータは、EXEMPT REDACTION POLICYシステム権限が付与されているユーザーは除き、表の問合せを行った任意のユーザーにポリシーを適用します。(EXEMPT REDACTION POLICYシステム権限の詳細は、Oracle Data Redactionポリシーからのユーザーの除外を参照してください。)

例10-1 完全データ・リダクション・ポリシー

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema    => 'hr', 
   object_name      => 'employees', 
   column_name      => 'commission_pct',
   policy_name      => 'redact_com_pct', 
   function_type    => DBMS_REDACT.FULL,
   expression       => '1=1');
END;
/

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

SELECT COMMISSION_PCT FROM HR.EMPLOYEES;

COMMISSION_PCT
--------------
0
0
0

例: 完全にリダクションされた文字値

DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、文字値を完全にリダクションするポリシーを作成できます。

例10-2では、mavis.cust_info表のuser_id列のユーザーIDを完全にリダクションする方法を示しています。user_id列は、VARCHAR2データ型です。出力は空白の文字列です。expression設定により、MGRロールのあるユーザーは、ユーザーIDを表示できます。

例10-2 完全にリダクションされた文字値

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema   => 'mavis', 
   object_name     => 'cust_info', 
   column_name     => 'user_id',
   policy_name     => 'redact_cust_user_ids', 
   function_type   => DBMS_REDACT.FULL,
   expression      => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''MGR'') = ''FALSE''');
END;
/

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

SELECT user_id FROM mavis.cust_info;

USER_ID
------------
0
0
0

デフォルトの完全データ・リダクション値の変更

DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを使用すると、デフォルトの完全データ・リダクション値を変更できます。

内容は次のとおりです。

デフォルトの完全データ・リダクション値の変更について

完全データ・リダクション・ポリシーで表示されるデフォルトの値を変更できます。

Oracle DatabaseがNUMBERデータ型の列に完全リダクション(DBMS_REDACT.FULL)を実行する場合、デフォルトでは0がリダクションされた値です。これを他の値(たとえば、7)に変更する場合、DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを実行すると、この値を変更できます。この変更は、現在のデータベース・インスタンスのすべてのデータ・リダクション・ポリシーに適用されます。値を有効にするには、変更した後に、データベースを再起動する必要があります。現在の値を検索するには、REDACTION_VALUES_FOR_TYPE_FULLデータ・ディクショナリ・ビューを問い合せます。

この変更は、完全なデータ・リダクションを使用するデータベースのすべてのデータ・リダクション・ポリシーに影響することに注意してください。デフォルトの完全データ・リダクション値を変更する前に、既存の完全データ・リダクション・ポリシーにこの変更が及ぼす影響を確認してください。

DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャの構文

DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャでは、サポートされている標準のOracle Databaseデータ型を使用できます。

構文は次のとおりです。

DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES (
 number_val       IN NUMBER                    NULL,
 binfloat_val     IN BINARY_FLOAT              NULL,
 bindouble_val    IN BINARY_DOUBLE             NULL,
 char_val         IN CHAR                      NULL,
 varchar_val      IN VARCHAR2                  NULL,
 nchar_val        IN NCHAR                     NULL,
 nvarchar_val     IN NVARCHAR2                 NULL,
 date_val         IN DATE                      NULL,
 ts_val           IN TIMESTAMP                 NULL,
 tswtz_val        IN TIMESTAMP WITH TIME ZONE  NULL,
 blob_val         IN BLOB                      NULL,
 clob_val         IN CLOB                      NULL,
 nclob_val        IN NCLOB                     NULL);

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

  • number_valは、NUMBERデータ型の列のデフォルトの値を変更します。

  • binfloat_valは、BINARY_FLOATデータ型の列のデフォルトの値を変更します。

  • bindouble_valは、BINARY_DOUBLEデータ型の列のデフォルトの値を変更します。

  • char_valは、CHARデータ型の列のデフォルトの値を変更します。

  • varchar_valは、VARCHAR2データ型の列のデフォルトの値を変更します。

  • nchar_valは、NCHARデータ型の列のデフォルトの値を変更します。

  • nvarchar_valは、NVARCHAR2データ型の列のデフォルトの値を変更します。

  • date_valは、DATEデータ型の列のデフォルトの値を変更します。

  • ts_valは、TIMESTAMPデータ型の列のデフォルトの値を変更します。

  • tswtz_valは、TIMESTAMP WITH TIME ZONEデータ型の列のデフォルトの値を変更します。

  • blob_valは、BLOBデータ型の列のデフォルトの値を変更します。

  • clob_valは、CLOBデータ型の列のデフォルトの値を変更します。

  • nclobは、NCLOBデータ型の列のデフォルトの値を変更します。

デフォルトの完全データ・リダクション値の変更

デフォルトの完全データ・リダクション値を変更するには、DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを使用します。

  1. SYSDBA管理権限を持つユーザーSYSとしてデータベース・インスタンスにログインします。

  2. 変更する値を確認します。

    たとえば、NUMBERデータ型を使用する列の現在の値を確認します。

    SELECT NUMBER_VALUE FROM REDACTION_VALUES_FOR_TYPE_FULL;
    
    NUMBER_VALUE
    ------------
               0
    
  3. DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを実行して値を変更します。

    例:

    EXEC DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES (number_val => 7);
    
  4. データベース・インスタンスを再起動します。

    例:

    SHUTDOWN IMMEDIATE
    
    STARTUP

部分リダクション・ポリシーの作成

部分データ・リダクションでは、様々な種類のデータ型についてデータの一部をリダクションできます。

内容は次のとおりです。

部分リダクション・ポリシーの作成について

データの部分リダクションでは、ID番号の最初の5桁など、データの一部のみがリダクションされます。

たとえば、クレジット・カードの番号の大半(最後の4桁以外)をアスタリスク(*)でリダクションできます。文字、数値または日時のデータ型を使用する列に対してポリシーを作成できます。文字データ型のリダクションを行うポリシーには、固定文字リダクション形式を使用できます。Enterprise Manager for Oracle Database 12.1.0.7プラグインがシステムにデプロイされている場合は、カスタム・リダクション形式を作成して保存することもできます。

注意:

以前のリリースでは、「形式」のかわりに「ショートカット」という用語が使用されていました。

部分リダクション・ポリシーを作成する構文

DBMS_REDACT.ADD_POLICY文では、アプリケーションに戻されるデータの特定の部分をリダクションするポリシーを作成できます。

部分リダクション・ポリシーを作成する場合の 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,
   function_parameters     IN VARCHAR2 := NULL,
   expression              IN VARCHAR2,
   enable                  IN BOOLEAN := TRUE);

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

固定文字形式を使用した部分リダクション・ポリシーの作成

DBMS_REDACT.ADD_POLICY function_parametersパラメータを使用することにより、固定文字形式を使用できるようになります。

内容は次のとおりです。

固定文字形式の設定

Oracle Data Redactionには、固定文字を使用するポリシーを構成するための、特別な事前定義形式が用意されています。

表10-2では、 DBMS_REDACT.ADD_POLICY function_parametersパラメータ形式について説明します。これは、通常リダクションされることが多い社会保障番号、郵便番号およびクレジット・カード(列でVARCHAR2またはNUMBERデータ型のいずれかが使用される)に対して使用できます。

表10-2 部分固定文字リダクションの形式

形式 説明

DBMS_REDACT.REDACT_US_SSN_F5

列がVARCHAR2データ型の場合、社会保障番号の最初の5つの数字をリダクションします。たとえば、番号987-65-4320XXX-XX-4320になります。

DBMS_REDACT.REDACT_US_SSN_L4

列がVARCHAR2データ型の場合、社会保障番号の最後の4つの数字をリダクションします。たとえば、番号987-65-4320987-65-XXXXになります。

DBMS_REDACT.REDACT_US_SSN_ENTIRE

列がVARCHAR2データ型の場合、社会保障番号全体をリダクションします。たとえば、番号987-65-4320XXX-XX-XXXXになります。

DBMS_REDACT.REDACT_NUM_US_SSN_F5

列がNUMBERデータ型の場合、社会保障番号の最初の5つの数字をリダクションします。たとえば、番号987654320XXXXX4320になります。

DBMS_REDACT.REDACT_NUM_US_SSN_L4

列がNUMBERデータ型の場合、社会保障番号の最後の4つの数字をリダクションします。たとえば、番号98765432098765XXXXになります。

DBMS_REDACT.REDACT_NUM_US_SSN_ENTIRE

列がNUMBERデータ型の場合、社会保障番号全体をリダクションします。たとえば、番号987654320XXXXXXXXXになります。

DBMS_REDACT.REDACT_ZIP_CODE

列がVARCHAR2データ型の場合、5桁の郵便番号をリダクションします。たとえば、95476XXXXXになります。

DBMS_REDACT.REDACT_NUM_ZIP_CODE

列がNUMBERデータ型の場合、5桁の郵便番号をリダクションします。たとえば、95476XXXXXになります。

DBMS_REDACT.REDACT_DATE_MILLENNIUM

DD-MON-YY形式の日付を01-JAN-00 (2000年1月1日)にリダクションします。

DBMS_REDACT.REDACT_DATE_EPOCH

すべての日付を01-JAN-70にリダクションします。

DBMS_REDACT.REDACT_CCN16_F12

最後の4桁は表示したまま、16桁のクレジット・カード番号をリダクションします。たとえば、5105 1051 0510 5100****-****-****-5100になります。

関連項目:

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

例: 固定文字形式を使用した部分リダクション・ポリシー

DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、固定文字形式を使用する部分リダクション・ポリシーを作成できます。

例10-3 では、VARCHAR2データ型の列にある社会保障番号をREDACT_US_SSN_F5 形式によってリダクションする方法について説明します。

例10-3 部分的にリダクションされた文字値

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema       => 'mavis', 
   object_name         => 'cust_info', 
   column_name         => 'ssn',
   policy_name         => 'redact_cust_ssns3', 
   function_type       => DBMS_REDACT.PARTIAL,
   function_parameters => DBMS_REDACT.REDACT_US_SSN_F5,
   expression          => '1=1',
   policy_description  => 'Partially redacts 1st 5 digits in SS numbers',
   column_description  => 'ssn contains Social Security numbers');
END;
/

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

SELECT ssn FROM mavis.cust_info;

SSN
-------
XXX-XX-4320
XXX-XX-4323
XXX-XX-4325
XXX-XX-4329

文字データ型を使用した部分リダクション・ポリシーの作成

DBMS_REDACT.ADD_POLICY function_parametersパラメータを使用することにより、文字データ型をリダクションできるようになります。

内容は次のとおりです。

文字データ型の設定

Oracle Data Redactionには、文字データ型を使用するポリシーを構成するための、特別な設定が用意されています。

DBMS_REDACT.ADD_POLICYfunction_parametersパラメータを設定して文字データ型の部分リダクションを定義するときは、次の順序で次の設定の値を入力します。各値はカンマで区切ります。

注意:

部分リダクションには、固定幅の文字セットを使用する必要があることに注意してください。つまり、リダクションされる各文字は、バイト長が等しい別の文字に置換される必要があります。可変長の文字セット(たとえば、UTF-8)を使用する場合、正規表現ベースのリダクションを使用する必要があります。詳細は、正規表現ベースのリダクション・ポリシーを作成する構文を参照してください。

設定は次のとおりです。

  1. 入力形式: データが現在どのようにフォーマットされているかを指定します。クレジット・カード番号の全桁など、リダクションされる可能性のある各文字にVを入力します。クレジット・カード番号のハイフンまたは空白のような書式化文字を使用して書式化する場合、Fを入力します。各文字に、対応するVまたはF値があるか確認します。(入力形式の値は大/小文字を区別しません。)

  2. 出力形式: 表示されるデータを書式化する方法を定義します。リダクションされる可能性のある各文字にVを入力します。入力形式の各文字Fをハイフンなど表示される文字に使用する文字に置換します。(出力形式の値は大/小文字を区別しません。)

  3. マスク文字: リダクションに使用する文字を指定します。アスタリスク(*)など、リダクションに使用する単一の文字を入力します。

  4. 開始する数字位置: リダクションで開始するVの数字位置を指定します。

  5. 終了する数字位置: リダクションで終了するVの数字位置を指定します。終了する位置の値を決めるときは、Fの位置を含めないでください。

たとえば、次の設定は、クレジット・カード番号5105 1051 0510 5100の最初の12桁のVをリダクションし、Fの位置(空白)をハイフンに置換することでクレジット・カード番号で通常使用されるスタイルに書式化し、その結果****-****-****-4320と表示されます。

function_parameters  => 'VVVVFVVVVFVVVVFVVVV,VVVV-VVVV-VVVV-VVVV,*,1,12',

関連項目:

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

例: 文字データ型を使用した部分リダクション・ポリシー

DBMS_REDACT.ADD_POLICY PL/SQLプロシージャにより、文字データ型を使用する部分リダクション・ポリシーを作成できます。

例10-4には、VARCHAR2データ型の列にある社会保障番号をリダクションする方法と、社会保障番号に含まれているハイフンを保持する方法を示します。

例10-4 部分的にリダクションされた文字値

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema       => 'mavis', 
   object_name         => 'cust_info', 
   column_name         => 'ssn',
   policy_name         => 'redact_cust_ssns2', 
   function_type       => DBMS_REDACT.PARTIAL,
   function_parameters => 'VVVFVVFVVVV,VVV-VV-VVVV,*,1,5',
   expression          => '1=1',
   policy_description  => 'Partially redacts Social Security numbers',
   column_description  => 'ssn contains character Social Security numbers');
END;
/

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

SELECT ssn FROM mavis.cust_info;

SSN
-----------
***-**-4320
***-**-4323
***-**-4325
***-**-4329

数値データ型を使用した部分リダクション・ポリシーの作成

DBMS_REDACT.ADD_POLICY function_parametersパラメータを使用することにより、数値データ型をリダクションできるようになります。

内容は次のとおりです。

数値データ型の設定

数値データ型の値を設定する場合、マスク文字、開始する数字位置および終了する数字位置を指定する必要があります。

数値データ型の部分リダクションの場合、DBMS_REDACT.ADD_POLICY function_parametersパラメータについて、次の設定項目の値を記載されている順番に入力できます。

  1. マスク文字: 表示する文字を指定します。0から9までの数値を入力します。

  2. 開始する数字位置: 最初の数字に1を指定するなど、リダクションで開始するの数字位置を指定します。

  3. 終了する数字位置: リダクションで終了する数字位置を指定します。

たとえば、次の設定は、社会保障番号987654321の最初の5桁をリダクションし、その結果、999994321と表示されます。

function_parameters  => '9,1,5',

関連項目:

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

例: 数値データ型を使用した部分リダクション・ポリシー

DBMS_REDACT.ADD_POLICYプロシージャにより、数値データ型を使用する部分リダクション・ポリシーを作成できます。

例10-5では、mavis.cust_info表の一連の社会保障番号を、ログインした任意のアプリケーション・ユーザーに対して部分リダクションする方法を示しています。(そのため、expressionパラメータはTRUEと評価されます。)

このタイプのリダクションが役立つのは、文字列ではなく書式設定された数値をアプリケーションが想定している場合です。このシナリオでは、社会保障番号はデータ型NUMBERの列にあります。つまり、ssn列に含まれるのは数字のみで、ハイフンまたは空白など他の文字は含まれせん。

例10-5 部分的にリダクションされたデータ・リダクションの数値

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema       => 'mavis', 
   object_name         => 'cust_info', 
   column_name         => 'ssn',
   policy_name         => 'redact_cust_ssns1', 
   function_type       => DBMS_REDACT.PARTIAL,
   function_parameters => '7,1,5',
   expression          => '1=1',
   policy_description  => 'Partially redacts Social Security numbers',
   column_description  => 'ssn contains numeric Social Security numbers');
END;
/

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

SELECT ssn FROM mavis.cust_info;

SSN
---------
777774320
777774323
777774325
777774329

日時データ型を使用した部分リダクション・ポリシーの作成

DBMS_REDACT.ADD_POLICY function_parametersパラメータを使用することにより、日時データ型をリダクションできるようになります。

内容は次のとおりです。

日時データ型の設定

Oracle Data Redactionには、日時データ型を構成するための特別な設定が用意されています。

日時データ型の部分リダクションの場合、次のDBMS_REDACT.ADD_POLICY function_parametersパラメータ設定項目の値を入力します。

値は次に示す順序で入力します。

  1. m: 月をリダクションします。月の名前でリダクションするには、1から12を小文字のmに追加します。たとえば、m5は、MAYと表示されます。リダクションを省略するには、大文字のMを入力します。

  2. d: 月の日をリダクションします。月の日でリダクションするには、1から31を小文字のdに追加します。たとえば、d7は、07と表示されます。月の日よりも大きい数値(たとえば、2月に31を入力)を入力すると、その月の最終日(たとえば、28)が表示されます。リダクションを省略するには、大文字のDを入力します。

  3. y: 年をリダクションします。年でリダクションするには、1から9999を小文字のyに追加します。たとえば、y1984は、84と表示されます。リダクションを省略するには、大文字のYを入力します。

  4. h: 時間をリダクションします。時間でリダクションするには、0から23を小文字のhに追加します。たとえば、h20は、20と表示されます。リダクションを省略するには、大文字のHを入力します。

  5. m: 分をリダクションします。分でリダクションするには、0から59を小文字のmに追加します。たとえば、m30は、30と表示されます。リダクションを省略するには、大文字のMを入力します。

  6. s: 秒をリダクションします。秒でリダクションするには、0から59を小文字のsに追加します。たとえば、s45は、45と表示されます。リダクションを省略するには、大文字のSを入力します。

関連項目:

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

例: 日時データ型を使用した部分リダクション・ポリシー

DBMS_REDACT.ADD_POLICYプロシージャにより、日時データ型を使用する部分リダクション・ポリシーを作成できます。

例10-6では、日付を部分的にリダクションする方法を示しています。この例では顧客の誕生年をリダクションし、それを13に置き換え、残りの値はそのまま保持します。

例10-6 日時値を使用した部分リダクションによるデータ・リダクション

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema       => 'mavis', 
   object_name         => 'cust_info', 
   column_name         => 'birth_date',
   policy_name         => 'redact_cust_bdate', 
   function_type       => DBMS_REDACT.PARTIAL,
   function_parameters => 'mdy2013HMS',
   expression          => '1=1',
   policy_description  => 'Replaces birth year with 2013',
   column_description  => 'birth_date contains customer's birthdate');
END;
/

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

SELECT birth_date FROM mavis.cust_info;

BIRTH_DATE
07-DEC-13 09.45.40.000000 AM
12-OCT-13 04.23.29.000000 AM

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

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

内容は次のとおりです。

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

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

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

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

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

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

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

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と入力します。

    次の点に注意してください。

    • function_typeパラメータをDBMS_REDACT.REGEXPに設定すると、function_parametersパラメータを省略します。

    • 正規表現(regexp_patternregexp_replaceregexp_positionregexp_occurrenceおよびregexp_match_parameter)を、patternreplacepositionoccurrenceおよびmatch_parameter引数をREGEXP_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またはRE_BEGINNING形式で、Oracle Databaseがcolumn_nameデータの最初の文字で検索を開始することを意味します。

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

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

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

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

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

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

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

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

DBMS_REDACT.ADD_POLICYプロシージャ内のregexp_patternパラメータとregexp_replace_stringパラメータの両方に対して形式を使用できます。

内容は次のとおりです。

正規表現の形式

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

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

表10-3 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_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に置換されます。

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

表10-4 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_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に置換されます。

関連項目:

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

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

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

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

例10-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,
   function_parameters    => NULL,
   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_MATCH_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

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

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

内容は次のとおりです。

カスタム正規表現の設定

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プロシージャの一般的な構文を参照してください。

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

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

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

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

SELECT emp_id FROM mavis.cust_info;

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

例10-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 customer IDs using regular expression',
   column_description     => 'emp_id contains employee ID numbers');
END;
/

ランダム・リダクション・ポリシーの作成

ランダム・リダクション・ポリシーは、リダクションされたデータをランダムに生成した値(Ukjsl32[[]]]sなど)で表します。

内容は次のとおりです。

ランダム・リダクション・ポリシーを作成する構文

ランダム・リダクション・ポリシーでは、問合せを行ったアプリケーション・ユーザーに対し、列のデータ型に基づいてランダムに生成された値によるリダクション済のデータが表示されます。

LOB列がサポートされていないことに注意してください。

ランダム・リダクション・ポリシーを作成する場合の 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);

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

例: ランダム・リダクション・ポリシー

DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、ランダム・リダクション・ポリシーを作成できます。

例10-9では、ランダム値の生成方法を示しています。SELECT文を実行するたびに、出力は異なります。

例10-9 ランダムにリダクションされたデータ・リダクションの値

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema   => 'mavis', 
   object_name     => 'cust_info', 
   column_name     => 'login_username',
   policy_name     => 'redact_cust_rand_username', 
   function_type   => DBMS_REDACT.RANDOM,
   expression      => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''APP_USER''');
END;
/

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

SELECT login_username FROM mavis.cust_info;

LOGIN_USERNAME
--------------
N[CG{\pTVcK

リダクションを使用しないポリシーの作成

開発環境でポリシーをテストする場合には、まったくリダクションを使用しないポリシーを作成できます。

内容は次のとおりです。

リダクションを使用しないポリシーの作成の構文

リダクション・タイプNoneを指定するオプションを使用して、リダクション・ポリシーの内部動作をテストできます。

リダクション・タイプNoneは、ポリシーが定義された表に対する問合せの結果に影響を与えません。このオプションを使用して、リダクション・ポリシー定義を本番環境に適用する前にテストできます。LOB列がサポートされていないことに注意してください。

リダクションを使用しないポリシーを作成する場合の 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);

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

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

  • function_type: データ・リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.NONEと入力します。

    function_typeパラメータを省略する場合、デフォルトのリダクションfunction_type設定は、DBMS_REDACT.FULLです。

例: リダクションを実行しない

DBMS_REDACT.ADD_POLICYプロシージャによって、リダクションを実行しないポリシーを作成できます。

例10-10では、表示されている値のいずれもリダクションしないデータ・リダクション・ポリシーの生成方法を示しています。

例10-10 リダクションされないデータ・リダクション値

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema    => 'mavis', 
   object_name      => 'cust_info', 
   column_name      => 'user_name',
   policy_name      => 'redact_cust_no_vals', 
   function_type    => DBMS_REDACT.NONE,
   expression       => '1=1');
END;
/

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

SELECT user_name FROM mavis.cust_info;

USER_NAME
----------
IDA NEAU

Oracle Data Redactionポリシーからのユーザーの除外

アクセスしたデータにOracle Data Redactionポリシーを適用しないように、ユーザーを除外することができます。

そのためには、そのユーザーにEXEMPT REDACTION POLICYシステム権限を付与する必要があります。この権限は信頼できるユーザーにのみ付与してください。

また、この権限を付与されているユーザーに加え、ユーザーSYSも、すべてのデータ・リダクション・ポリシーから除外されます。データ・リダクション・ポリシーを作成するユーザーは、そのユーザーがユーザーSYSであるか、またはEXEMPT REDACTION POLICYシステム権限が付与されている場合を除き、デフォルトでは、データ・リダクション・ポリシーから除外されません。

次の点に注意してください。

  • 表に対するINSERT権限があるユーザーは、データ・リダクション・ポリシーがテーブルに存在するかどうかにかかわらず、リダクションされた列に値を挿入できます。データ・リダクションは、ユーザーが発行したSQL SELECT文(つまり、問合せ)のみに影響し、ユーザーが発行するその他のSQL(INSERTUPDATEまたはDELETE文など)には影響しません。(この例の例外は、次の箇条書きを参照してください。)

  • 選択されている列(ソース列)のいずれかがデータ・リダクション・ポリシーで保護されている場合、ユーザーは、EXEMPT REDACTION POLICYシステム権限が付与されていないかぎり、CREATE TABLE AS SELECTを実行できません(同様に、ソースがリダクションされた列である場合、DML操作も実行できません)。

  • EXEMPT REDACTION POLICYシステム権限は、DBAロールに含まれますが、この権限は、DBAロールが付与された場合のWITH ADMIN OPTIONには含まれないので、明示的にユーザーに付与される必要があります。DBAロールには、EXEMPT REDACTION POLICYシステム権限が付与されるEXP_FULL_DATABASEロールが含まれるため、DBAロールが付与されたユーザーはリダクション・ポリシーから除外されます。

関連項目:

Oracle Data Redactionポリシーの変更

DBMS_REDACT.ALTER_POLICYプロシージャでは、Oracle Data Redactionポリシーを変更できます。

内容は次のとおりです。

Oracle Data Redactionポリシーの変更について

DBMS_REDACT.ALTER_POLICYプロシージャは、データ・リダクション・ポリシーを変更します。

ポリシーがすでに有効化されている場合は、最初に無効化する必要はなく、またポリシーを変更した後でもポリシーは有効化された状態が維持されます。

REDACTION_POLICIESデータ・ディクショナリ・ビューのPOLICY_NAME列を問い合せて、既存のデータ・リダクション・ポリシーの名前を検索したり、REDACTION_COLUMNSビューを問い合せて、ポリシー内に指定された列、関数およびパラメータに関する情報を検索できます。完全データ・リダクションを使用するポリシーを現在の値から検索するには、REDACTION_VALUES_FOR_TYPE_FULLデータ・ディクショナリ・ビューを問い合せます。

actionパラメータは、実行する変更の型を指定します。このプロシージャを実行するときは、少なくともobject_nameおよびpolicy_nameパラメータを含める必要があります。

DBMS_REDACT.ALTER_POLICYプロシージャの構文

DBMS_REDACT.ALTER_POLICYプロシージャの構文を使用して、すべてのタイプのデータ・リダクション・ポリシーを変更できます。

DBMS_REDACT.ALTER_POLICYプロシージャの構文は次のとおりです。

DBMS_REDACT.ALTER_POLICY (
   object_schema          IN VARCHAR2 := NULL, 
   object_name            IN VARCHAR2 := NULL, 
   policy_name            IN VARCHAR2, 
   action                 IN BINARY_INTEGER := DBMS_REDACT.ADD_COLUMN,
   column_name            IN VARCHAR2 := NULL,
   function_type          IN BINARY_INTEGER := DBMS_REDACT.FULL,
   function_parameters    IN VARCHAR2 := NULL,
   expression             IN VARCHAR2 := NULL,
   regexp_pattern         IN VARCHAR2 := NULL,
   regexp_replace_string  IN VARCHAR2 := NULL,
   regexp_position        IN BINARY_INTEGER := NULL,
   regexp_occurrence      IN BINARY_INTEGER := NULL,
   regexp_match_parameter IN VARCHAR2 := NULL,
   policy_description     IN VARCHAR2 := NULL,
   column_description     IN VARCHAR2 := NULL);

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

  • action: 次のいずれかの値を1つ選択し、使用するアクションの種類を定義します。

    • DBMS_REDACT.MODIFY_COLUMN (column_nameの値を変更する場合)

    • DBMS_REDACT.ADD_COLUMN ((ポリシーですでに保護されている列に加えて)リダクションのために新しい列を追加する場合)この設定はactionパラメータのデフォルトです。

    • DBMS_REDACT.DROP_COLUMN (列からリダクションを削除する場合)。

    • DBMS_REDACT.MODIFY_EXPRESSION (expressionの値を変更する場合)各ポリシーに指定できるポリシー式は1つのみです。つまり、ポリシー式を変更する際は、既存のポリシー式を新しいポリシー式で置換します。

    • DBMS_REDACT.SET_POLICY_DESCRIPTION (ポリシーの説明を変更する場合)

    • DBMS_REDACT.SET_COLUMN_DESCRIPTION (列の説明を変更する場合)

関連項目:

DBMS_REDACT.ALTER_POLICY操作に必要なパラメータ

DBMS_REDACT.ALTER_POLICYプロシージャには、列の追加や変更などの様々な操作を実行できるパラメータが用意されています。

表10-5は、これらのパラメータの組合せを示しています。

表10-5 様々なDBMS_REDACT.ALTER_POLICYの操作に必要なパラメータ

変更内容 設定パラメータ

列の追加または変更

  • action (DBMS_REDACT.MODIFY_COLUMN)

  • column_name

  • function_type

  • function_parameters (必要な場合)

  • regexp* (必要な場合)

ポリシー式の変更

  • action (DBMS_REDACT.MODIFY_EXPRESSION)

  • expression

ポリシーの説明の変更

  • action (DBMS_REDACT.SET_POLICY_DESCRIPTION)

  • policy_description

列の説明の変更

  • action (DBMS_REDACT.SET_COLUMN_DESCRIPTION)

  • column_description

列の削除

  • action (DBMS_REDACT.DROP_COLUMN)

  • column_name

チュートリアル: Oracle Data Redactionポリシーの変更

列ごとに独自のリダクション設定を使用して、表またはビューの複数の列をリダクションできます。

この項の演習は、データ・リダクション・ポリシーを変更して、複数の列をリダクションする方法を示しています。また、ポリシーのexpression設定を変更する方法も示しています。これを実行するには、各段階でDBMS_REDACT.ALTER_POLICYプロシージャを実行する必要があります。

  1. ユーザーの作成およびそれらのユーザーへの権限の付与を行う権限を持つユーザーとして接続します。

    例:

    CONNECT sec_admin
    Enter password: password
  2. 次のユーザーを作成します。

    GRANT CREATE SESSION TO dr_admin IDENTIFIED BY password;
    GRANT CREATE SESSION TO sales_rep IDENTIFIED BY password;
    GRANT CREATE SESSION TO support_rep IDENTIFIED BY password;
  3. ユーザーdr_adminに、DBMS_REDACT PL/SQLパッケージに対するEXECUTEを付与します。

    GRANT EXECUTE ON DBMS_REDACT TO dr_admin;
  4. ユーザーOEとして接続します。

    CONNECT OE
    Enter password: password
  5. 顧客のクレジット・カード情報を含む表を作成し移入します。

    CREATE TABLE cust_order_info(
     first_name varchar2(20),
     last_name varchar2(20),
     address varchar2(30),
     city varchar2(30),
     state varchar2(3),
     zip varchar2(5),
     cc_num varchar(19),
     cc_exp varchar2(7));
    
    
    INSERT INTO cust_order_info VALUES ('Jane','Dough','39 Mockingbird Lane', 'San Francisco', 'CA', 94114, '5105 1051 0510 5100', '10/2018');
    INSERT INTO cust_order_info VALUES ('Mary','Hightower','2319 Maple Street', 'Sonoma', 'CA', 95476, '5111 1111 1111 1118', '03/2019'); 
    INSERT INTO cust_order_info VALUES ('Herbert','Donahue','292 Winsome Way', 'San Francisco', 'CA', 94117, '5454 5454 5454 5454', '08/2018'); 
  6. ユーザーsales_repおよびsupport_repに、表cust_order_infoに対するSELECT権限を付与します。
    GRANT SELECT ON cust_order_info TO sales_rep, support_rep;
  7. ユーザーdr_adminとして接続します。

    CONNECT dr_admin
    Enter password: password
  8. クレジット・カード番号をリダクションするポリシーを作成し、有効にします。

    BEGIN DBMS_REDACT.ADD_POLICY(
        object_schema              => 'oe',
        object_name                => 'cust_order_info',
        column_name                => 'cc_num',
        policy_name                => 'redact_cust_cc_info',
        function_type              => DBMS_REDACT.REGEXP,
        function_parameters        => NULL,
        expression                 => '1=1',
        regexp_pattern             => DBMS_REDACT.RE_PATTERN_CCN,
        regexp_replace_string      => DBMS_REDACT.RE_REDACT_CCN,
        regexp_position            => NULL,
        regexp_occurrence          => NULL,
        regexp_match_parameter     => NULL,
        policy_description         => 'Partially redacts credit card info',
        column_description         => 'cc_num_number lists credit card numbers');
    END;
    /
  9. ポリシーを有効期限のリダクションを含めるよう変更します。
    BEGIN DBMS_REDACT.ALTER_POLICY(
        object_schema     => 'oe',
        object_name       => 'cust_order_info',
        policy_name       => 'redact_cust_cc_info',
        action            => DBMS_REDACT.ADD_COLUMN,
        column_name       => 'cc_exp',
        function_type     => DBMS_REDACT.RANDOM,
        expression        => '1-1');
    END;
    /
  10. ユーザーsales_repがリダクション済の値を表示し、ユーザーsupport_rep実際のデータを表示する条件を使用するよう、再度ポリシーを変更します。

    BEGIN
       DBMS_REDACT.ALTER_POLICY(
       object_schema     => 'oe',
       object_name       => 'cust_order_info',
       policy_name       => 'redact_cust_cc_info',
       action            => DBMS_REDACT.MODIFY_EXPRESSION,
       expression        => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''SALES_REP''');
    END;
    /
  11. ポリシーをテストするために、2人のユーザーに表cust_order_infoを問い合せさせます。

    CONNECT suport_rep
    Enter password: password
    
    SELECT cc_num, cc_exp FROM OE.cust_order_info;
    
    CC_NUM               CC_EXP
    -------------------  -------
    5105 1051 0510 5100  10/2018
    5111 1111 1111 1118  03/2019
    5454 5454 5454 5454  08/2018
    

    ユーザーsupport_repは実際のデータを表示できます。

    CONNECT sales_rep
    Enter password: password
    
    SELECT cc_num, cc_exp FROM OE.cust_order_info;
    
    CC_NUM             CC_EXP
    ----------------   -------
    ************5100   lST=033
    ************1119   OZA.w4C
    ************5454   B(9+;O1
    

    実際のデータは、ユーザーsales_repを使用してリダクションされます。

  12. support_repのみがリダクション済データを表示でき、sales_repは表示できないようにする条件を含めるよう、cust_order_infoを変更します。

    CONNECT dr_admin
    Enter password: password
    
    BEGIN
       DBMS_REDACT.ALTER_POLICY(
       object_schema      => 'oe',
       object_name        => 'cust_order_info',
       policy_name        => 'redact_cust_cc_info',
       action             => DBMS_REDACT.MODIFY_EXPRESSION,
       expression         => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''SUPPORT_REP''');
    END;
    /
  13. ユーザーに再度ポリシーをテストさせます。

    CONNECT support_rep
    Enter password: password
    
    SELECT cc_num, cc_exp FROM OE.cust_order_info;
    
    CC_NUM             CC_EXP
    ----------------   -------
    ************5100   1^XMF~`
    ************1119   qz+9=#S
    ************5454   *KCaUkm
    

    これで実際のデータがリダクションされるため、ユーザーsupport_repはこのデータを表示できなくなります。

    CONNECT sales_rep
    Enter password: password
    
    SELECT cc_num, cc_exp FROM OE.cust_order_info;
    
    CC_NUM               CC_EXP
    -------------------  -------
    5105 1051 0510 5100  10/2018
    5111 1111 1111 1118  03/2019
    5454 5454 5454 5454  08/2018
    

    これでユーザーsales_repは実際のデータを表示できます。

  14. このチュートリアルのコンポーネントが不要になった場合、次のようにしてそれらを削除できます。

    CONNECT dr_admin
    Enter password: password
    
    BEGIN
      DBMS_REDACT.DROP_POLICY (
        object_schema  => 'oe',
        object_name    => 'cust_order_info',
        policy_name    => 'redact_cust_cc_info');
    END;
    /
    
    CONNECT sec_admin
    Enter password: password
    
    DROP USER dr_admin;
    DROP USER sales_rep;
    DROP USER support_rep;
    
    CONNECT OE
    Enter password: password
    
    DROP TABLE cust_order_info;

複数列のリダクション

データ・リダクション・ポリシーで2つ以上の列をリダクションできます。

内容は次のとおりです。

1つの表またはビューのデータ・リダクション・ポリシーへの列の追加

1つの表またはビューで、様々なリダクション・タイプを使用して様々なデータ型の列をリダクションできます。

  1. リダクションする最初の列に対するポリシーを作成します。

  2. DBMS_REDACT.ALTER_POLICYプロシージャを使用して、ポリシーに次の列を追加します。

    必要に応じて、actioncolumn_namefunction_typeおよびfunction_parametersパラメータ(またはregexp_で始まるパラメータ)を設定して、新しい列に対するリダクションを定義しますが、object_schemaobject_namepolicy_nameまたはexpressionパラメータは変更しないでください。リダクションされた各列には、それを作成するために使用したのと同じリダクション・パラメータが引き続き使用されます。

例: 複数列のリダクション

DBMS_REDACT.ALTER_POLICYプロシージャによって、複数の列をリダクションできます。

例10-11では、既存のデータ・リダクション・ポリシーに列を追加する方法を示しています。この例のactionパラメータは、DBMS_REDACT.ADD_COLUMNを使用して新しい列を追加する必要があることを定義しています。新しい列の名前であるcard_numは、column_nameパラメータによって設定されます。

例10-11 データ・リダクション・ポリシーへの列の追加

BEGIN
 DBMS_REDACT.ALTER_POLICY(
  object_schema       => 'mavis', 
  object_name         => 'cust_info', 
  policy_name         => 'redact_cust_user_ids', 
  action              => DBMS_REDACT.ADD_COLUMN,
  column_name         => 'card_num',
  function_type       => DBMS_REDACT.FULL,
  function_parameters => '',
  expression          => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''ADM'') = ''TRUE''');
END;
/

Oracle Data Redactionポリシーの有効化と無効化

作成したOracle Data Redactionポリシーは、必要に応じて無効化することも再度有効化することもできます。

内容は次のとおりです。

Oracle Data Redactionポリシーの無効化

DBMS_REDACT.DISABLE_POLICYプロシージャは、Oracle Data Redactionポリシーを無効化します。

REDACTION_POLICIESビューのPOLICY_NAMEおよびENABLE列を問い合せると、既存のデータ・リダクション・ポリシーの名前およびそれらが有効化されているかがわかります。ただし、ポリシーが存在している場合は、元のポリシーが無効化されていても表またはビューに他のポリシーを作成することはできません。つまり、同じ表の列に別のポリシーを作成する場合、最初のポリシーを削除してから新しいポリシーを作成して使用する必要があります。

  • データ・リダクション・ポリシーを無効化するには、次の構文を使用してDBMS_REDACT.DISABLE_POLICYプロシージャを実行します。

    DBMS_REDACT.DISABLE_POLICY (
       object_schema       IN VARCHAR2 DEFAULT NULL, 
       object_name         IN VARCHAR2, 
       policy_name         IN VARCHAR2);
    

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

    • object_schema: データ・リダクション・ポリシーを適用するオブジェクトのスキーマを指定します。この設定を省略(またはNULLを入力)する場合、Oracle Databaseは現在のスキーマ名を使用します。

    • object_name: データ・リダクション・ポリシーに使用する表またはビューの名前を指定します。

    • policy_name: 無効化するポリシーの名前を指定します。

例10-12では、データ・リダクション・ポリシーを無効化する方法を示しています。

例10-12 データ・リダクション・ポリシーの無効化

BEGIN
  DBMS_REDACT.DISABLE_POLICY (
    object_schema  => 'mavis',
    object_name    => 'cust_info',
    policy_name    => 'redact_cust_user_ids');
END;
/

データ・リダクション・ポリシーの有効化

DBMS_REDACT.ENABLE_POLICYプロシージャは、Oracle Data Redactionポリシーを有効化します。

新しいポリシーを作成した直後に有効化する必要はありません。作成プロセスによって処理されます。既存のデータ・リダクション・ポリシーの名前およびそれらが有効化されているかを確認するには、REDACTION_POLICIESビューのPOLICY_NAMEおよびENABLE列を問い合せます。ポリシーを有効にするプロシージャを実行すると、ポリシーはすぐに有効になります。

  • データ・リダクション・ポリシーを有効化するには、次の構文を使用してDBMS_REDACT.ENABLE_POLICYプロシージャを実行します。

    DBMS_REDACT.ENABLE_POLICY (
       object_schema       IN VARCHAR2 DEFAULT NULL, 
       object_name         IN VARCHAR2, 
       policy_name         IN VARCHAR2);
    

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

    • object_schema: データ・リダクション・ポリシーを適用するオブジェクトのスキーマを指定します。この設定を省略(またはNULLを入力)する場合、Oracle Databaseは現在のスキーマ名を使用します。

    • object_name: データ・リダクション・ポリシーに使用する表またはビューの名前を指定します。

    • policy_name: 有効化するポリシーの名前を指定します。

例10-13では、データ・リダクション・ポリシーを有効化する方法を示しています。

例10-13 データ・リダクション・ポリシーの有効化

BEGIN
  DBMS_REDACT.ENABLE_POLICY (
    object_schema  => 'mavis',
    object_name    => 'cust_info',
    policy_name    => 'redact_cust_user_ids');
END;
/

Oracle Data Redactionポリシーの削除

DBMS_REDACT.DROP_POLICYプロシージャは、Oracle Data Redactionポリシーを削除します。

Oracle Data Redactionポリシーは、有効であっても無効であっても削除できます。REDACTION_POLICIESビューのPOLICY_NAME列を問い合せて、既存のデータ・リダクション・ポリシーの名前を確認できます。Oracle Data Redactionポリシーに関連付けられた表またはビューを削除すると、ポリシーは自動的に削除されます。ベスト・プラクティスは、まずポリシーを削除し、その後、表またはビューを削除することです。詳細は、ごみ箱が有効になっている場合のOracle Data Redactionポリシーの削除を参照してください。

  • データ・リダクション・ポリシーを削除するには、DBMS_REDACT.DROP_POLICYプロシージャを実行します。

    次の構文を使用します。

    DBMS_REDACT.DROP_POLICY (
       object_schema       IN VARCHAR2 DEFAULT NULL, 
       object_name         IN VARCHAR2,
       policy_name         IN VARCHAR2);
    

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

    • object_schema: データ・リダクション・ポリシーが適用されるオブジェクトのスキーマを指定します。この設定を省略(またはNULLを入力)する場合、Oracle Databaseは現在のスキーマ名を使用します。

    • object_name: データ・リダクション・ポリシーに使用する表またはビューの名前を指定します。

    • policy_name: 削除するポリシーの名前を指定します。

DBMS_REDACT.DROP_POLICYプロシージャを実行した後、削除はすぐに有効になります。

例10-14では、データ・リダクション・ポリシーを削除する方法を示しています。

例10-14 データ・リダクション・ポリシーの削除

BEGIN
  DBMS_REDACT.DROP_POLICY (
    object_schema  => 'mavis',
    object_name    => 'cust_info',
    policy_name    => 'redact_cust_user_ids');
END;
/

チュートリアル: SQL式を使用したリダクションされた値を含むレポートの作成

SQL式を使用して、Oracle Data Redactionポリシーが定義された列に基づくレポートを作成できます。

SQL式に使用される値はリダクションされます。このリダクションはSQL式が評価される前に実行され、レポートに表示される結果の値は、リダクションされたSQL式の結果全体ではなく、リダクションされた値に対して評価されたSQL式の最終結果になります。

  1. HR.EMPLOYEES表に対して次のようなデータ・リダクション・ポリシーを作成します。

    このポリシーにより9という数値を持つSALARY列の最初の4桁の値およびCOMMISSION_PCT列の最初の1桁の値が9に置換されます。

    BEGIN
     DBMS_REDACT.ADD_POLICY(
       object_schema          => 'HR', 
       object_name            => 'EMPLOYEES', 
       column_name            => 'SALARY',
       column_description     => 'emp_sal_comm shows employee salary and commission',
       policy_name            => 'redact_emp_sal_comm', 
       policy_description     => 'Partially redacts the emp_sal_comm column',
       function_type          => DBMS_REDACT.PARTIAL,
       function_parameters    => '9,1,4',
       expression             => '1=1');
    END;
    /
    BEGIN
     DBMS_REDACT.ALTER_POLICY(
       object_schema          => 'HR',
       object_name            => 'EMPLOYEES',
       policy_name            => 'redact_emp_sal_comm',
       action                 => DBMS_REDACT.ADD_COLUMN,
       column_name            => 'COMMISSION_PCT',
       function_type          => DBMS_REDACT.PARTIAL,
       function_parameters    => '9,1,1',
       expression             => '1=1');
    END;
    /
    
  2. HRスキーマにログインして、次のレポートを実行します。

    このレポートでは、SQL式(SALARY + COMMISSION_PCT)を使用して、従業員の給料と歩合を組み合せます。

    SELECT (SALARY + COMMISSION_PCT) total_emp_compensation
    FROM HR.EMPLOYEES
    WHERE DEPARTMENT_ID = 80;
    
    TOTAL_EMP_COMPENSATION
    ----------------------
                    9999.9
                   9999.95
                  99990.95
    ...
    
  3. レポートには、連結などのSQL式を使用します。

    例:

    SELECT 'Employee ID '          || EMPLOYEE_ID ||
           ' has a salary of '     || SALARY || 
           ' and a commission of ' || COMMISSION_PCT || '.' detailed_emp_compensation
    FROM HR.EMPLOYEES
    WHERE DEPARTMENT_ID = 80
    ORDER BY EMPLOYEE_ID;
    
    DETAILED_EMP_COMPENSATION
    -------------------------------------------------------------
    Employee ID 150 has a salary of 99990 and a commission of .9.
    Employee ID 151 has a salary of 9999 and a commission of .95.
    Employee ID 152 has a salary of 9999 and a commission of .95.
    ...
  4. redact_emp_sal_commデータ・リダクション・ポリシーを作成したユーザーを接続し、次の文を実行してポリシーを削除します。

    BEGIN
      DBMS_REDACT.DROP_POLICY (
        object_schema => 'HR',
        object_name   => 'EMPLOYEES',
        policy_name   => 'redact_emp_sal_comm');
    END;
    /

Oracle Data Redactionポリシーのデータ・ディクショナリ・ビュー

Oracle Databaseには、データ・リダクション・ポリシーに関する情報をリストするデータ・ディクショナリ・ビューが用意されています。

これらのビューを問い合せる前に、SELECT_CATALOG_ROLEロールを付与する必要があります。

表10-6に、データ・リダクションのデータ・ディクショナリ・ビューを示します。

表10-6 データ・リダクション・ビュー

ビュー 説明

REDACTION_COLUMNS

データベースのリダクションされたすべての列を示し、列が存在する表またはビューの所有者、オブジェクト名、列名、リダクション機能のタイプ、リダクション機能に対するパラメータ(該当する場合)およびリダクション・ポリシーの説明の情報を提供します。ポリシー式が作成されている場合、デフォルトのオブジェクト全体にわたるポリシー式のSQL式を表示します。

REDACTION_EXPRESSIONS

既存のポリシー式の名前およびそれらのSQL式を表示します

REDACTION_POLICIES

データベースのすべてのデータ・リダクション・ポリシーを示します。これには、オブジェクトの所有者、オブジェクト名、ポリシー名、ポリシー式およびポリシーが有効かどうかに関する情報と、データ・リダクション・ポリシーの説明が含まれます。

REDACTION_VALUES_FOR_TYPE_FULL

完全リダクションを使用するデータ・リダクション・ポリシーの現在のリダクション値を表示します。