13 Oracle Data Redactionポリシーの構成

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

13.1 Oracle Data Redactionポリシーについて

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

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

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

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

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

  • 異なるデータ・リダクション・ポリシー式を作成し、同じ表またはビュー内の異なる列に対して個別に適用できます。

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

表13-1 DBMS_REDACTプロシージャ

プロシージャ 説明

DBMS_REDACT.ADD_POLICY

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

DBMS_REDACT.ALTER_POLICY

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

DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL

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

DBMS_REDACT.CREATE_POLICY_EXPRESSION

データ・リダクション・ポリシー式を作成します

DBMS_REDACT.DISABLE_POLICY

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

DBMS_REDACT.DROP_POLICY

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

DBMS_REDACT.DROP_POLICY_EXPRESSION

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

DBMS_REDACT.ENABLE_POLICY

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

DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES

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

DBMS_REDACT.UPDATE_POLICY_EXPRESSION

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

関連項目:

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

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

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

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

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

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

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

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

  3. データ・リダクション・ポリシーを追加するベース・オブジェクトに依存オブジェクトがあるかどうかを判別します。依存オブジェクトがある場合、これらのオブジェクトは、データ・リダクション・ポリシーがベース・オブジェクトに追加されると無効になり、これらのオブジェクトは、それらが使用されるときに自動的に再コンパイルされます。

    または、ALTER ... COMPILE文を使用して自分自身で事前に再コンパイルできます。(ベース・オブジェクトにデータ・リダクション・ポリシーを追加することにより)その依存オブジェクトを無効化して、再コンパイルする必要が生じると、システム全体のパフォーマンスが低下する場合があることに注意してください。Oracleでは、依存オブジェクトがあるオブジェクトへのデータ・リダクション・ポリシーの追加は、オフピーク時またはスケジュールされた停止時間中にのみ行うことをお薦めします。

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

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

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

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

  8. リダクションする追加の列を持つようにポリシーを構成します。

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

13.4 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式に関連する列にデータ・リダクション・ポリシーを定義することもできません。DBMS_STATS PL/SQLパッケージを使用してデータベース統計を収集している場合は、列グループの作成時にDBMS_STATSによって、内部的に非表示の仮想列が表に追加されることに注意してください。その結果、列グループの作成に使用される列でもある列にデータ・リダクション・ポリシーを追加すると、Oracle Databaseは「ORA-28073: 列column_nameにサポートされていないデータ型または属性があります。」エラーを返します。

      DBA_STAT_EXTENSIONSデータ・ディクショナリ・ビューへのアクセス権を持つユーザーは、次の問合せを使用してDBA_STAT_EXTENSIONSEXTENSION列を参照して仮想列式(DBMS_STATSによって内部的に作成される)を検索し、データ・リダクション・ポリシーを作成するためにDBMS_REDACT.ADD_POLICYコールに指定されている列名が含まれているかどうかを確認できます。

      SELECT EXTENSION_NAME, EXTENSION, CREATOR 
       FROM DBA_STAT_EXTENSIONS 
       WHERE TABLE_NAME='table_name_that_you_attempted_to_redact';
  • 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を指定するときは注意してください。列のすべての値が、使用している正規表現のセマンティクスに一致しているか確認します。詳細は、正規表現ベースのリダクション・ポリシーを作成する構文を参照してください。

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

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

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

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

expressionパラメータで定義される式は、Oracle Data Redactionポリシーのデフォルトの式です。データ・リダクション・ポリシーによってリダクションされることになっている列に対して名前付きポリシー式を適用した場合、名前付きポリシー式がデータ・リダクション・ポリシーで定義された式よりも優先されます。

他のOracle Database機能を使用する式を作成できます。たとえば、ユーザーの環境(ファンクションSYS_CONTEXTおよびXS_SYS_CONTEXTを使用)、文字列ファンクション、Oracle Label Securityのラベル優位ファンクション、またはOracle Application Expressファンクションに基づく式を作成できます。

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

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

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

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

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

13.5.2 データ・リダクション式でサポートされているファンクション

特定のタイプのデータを返すファンクション(SYS_CONTEXTネームスペースなど)を使用する式を作成できます。

13.5.2.1 ネームスペース・ファンクションを使用した式

データ・リダクション式で、ネームスペース・ファンクションSYS_CONTEXTおよびXS_SYS_CONTEXTを使用できます。

表13-2 ネームスペース・ファンクションを使用した式

ネームスペース・ファンクション 説明

SYS_CONTEXT

ネームスペースに関連した値を返します。次のネームスペース・ファンクションが有効です。

  • USERENV (デフォルトのネームスペース)、SESSION_USERCLIENT_IDENTIFIERなどの値を含みます。

  • SYS_SESSION_ROLES、各ロールの属性を含みます。

  • XS$SESSION、ユーザー・セッションの属性を含みます。

  • ユーザー定義のネームスペース、ただしこれらはポリシー式が作成される前にDBA_CONTEXTカタログ・ビューに存在している必要があります。

XS_SYS_CONTEXT

SYS_CONTEXTと同様ですが、Oracle Real Application Security環境用に設計されています。

XS_SYS_CONTEXTは、SYS_CONTEXTがサポートしているのと同じネームスペースをサポートします。

関連項目:

13.5.2.2 SUBSTRファンクションを使用した式

データ・リダクション式では、指定した文字列の部分を返す(文字1–3など)SUBSTRファンクションを使用できます。最初のパラメータは定数文字列か、SYS_CONTEXTファンクションまたはXS_SYS_CONTEXTファンクションへのコールである必要があります。

表13-3 SUBSTR文字列ファンクションを使用した式

SUBSTR文字列ファンクション 説明

SUBSTR

character positionから始まる、substring_lengthの文字長の入力char値の一部を返します。SUBSTRは、入力文字セットによって定義された文字を使用して、長さを計算します。

SUBSTRB

入力値の指定された部分をバイトで返します

SUBSTRC

入力値の指定された部分をUnicodeの完全文字で返します

SUBSTR2

入力値の指定された部分をUCS2コード・ポイントで返します

SUBSTR4

入力値の指定された部分をUCS4コード・ポイントで返します

関連項目:

SUBSTRファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください
13.5.2.3 文字列の長さファンクションを使用した式

データ・リダクション式では、文字列の長さを返す次のファンクションを使用できます。Oracle Databaseは、これらの演算子の各々への引数が、定数文字列であるか、SYS_CONTEXTファンクションまたはXS_SYS_CONTEXTファンクションへのコールであるかについても確認します。

表13-4 文字列ファンクションを使用した式

文字列ファンクション 説明

LENGTH

入力char値の長さを返します。LENGTHは、入力文字セットによって定義された文字を使用して、長さを算出します。

LENGTHB

入力値の長さをバイトで返します

LENGTHC

入力値の長さをUnicodeの完全文字で返します

LENGTH2

入力値の長さをUCS2コード・ポイントで返します

LENGTH4

入力値の長さをUCS4コード・ポイントで返します

関連項目:

LENGTHファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください
13.5.2.4 Oracle Application Expressファンクションを使用した式

データ・リダクション式で、Oracle Application Expressファンクションを使用できます。

表13-5 Oracle Application Expressファンクション

Oracle Application Expressファンクション 説明

V

アイテムのセッション・ステートを返します。APEX_UTIL.GET_SESSION_STATEファンクションのラッパーです

NV

数値項目の数値を返します。APEX_UTIL.GET_NUMERIC_SESSION_STATEファンクションのラッパーです

関連項目:

Oracle Application Expressファンクションの詳細は、『Oracle Application Express APIリファレンス』を参照してください
13.5.2.5 Oracle Label Securityファンクションを使用した式

Oracle Label Securityファンクションをデータ・リダクション式とともに使用できます。

太字のファンクションについては、Oracle Data Redactionが、それらのパラメータが定数であるか、ファンクションSA_UTL.NUMERIC_LABELCHAR_TO_LABELSA_SESSION.LABELのいずれかのみへのコールであること、およびこれらのファンクションへの引数が定数であることを確認します。

表13-6 Oracle Label Securityファンクション

Oracle Label Securityファンクション 説明

LBACSYS.OLS_LABEL_DOMINATES

Oracle Label Securityポリシーのセッション・ラベルが別のOLSラベルに優位であるか同位であるかを確認します

DOMINATES

1つのOLSラベルが2つ目のOLSラベルより優位であるか確認します。

Oracle Database 12cリリース1 (12.1)で非推奨になりました。かわりに、ファンクションOLS_DOMINATESまたはOLS_DOM を使用してください。

OLS_DOMINATES

1つのOLSラベルが2つ目のOLSラベルより優位であるか確認します

OLS_DOM

1つのOLSラベルが2つ目のOLSラベルより優位であるか確認します

DOM

1つのOLSラベルが2つ目のOLSラベルより優位であるか確認します

OLS_STRICTLY_DOMINATES

1つのOLSラベルが2つ目のOLSラベルより優位であり、同位ではないかを確認します

STRICTLY_DOMINATES

1つのOLSラベルが2つ目のOLSラベルより優位であり、同位ではないかを確認します

S_DOM

1つのOLSラベルが2つ目のOLSラベルより優位であり、同位ではないかを確認します。

Oracle Database 12cリリース1 (12.1)で非推奨になりました。かわりに、ファンクションOLS_DOMINATESまたはOLS_DOM を使用してください。

SA_UTL.DOMINATES

1つのOLSラベルが2つ目のOLSラベルに優位であるか、または特定のOLSポリシーのセッション・ラベルがOLSラベルに優位であるかを確認します

SA_UTL.CHECK_READ

ユーザーがポリシーで保護されている行を読み取ることができるかどうかをチェックします

SA_UTL.NUMERIC_LABEL

現行のセッションOLSラベルを返します

CHAR_TO_LABEL

文字列をOLSラベル・タグに変換します

SA_SESSION.LABEL

指定したOLSポリシーに関連付けられているラベルを返します

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

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

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

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

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

関連項目:

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

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

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

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

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

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

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

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

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

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

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

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

13.5.6 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アプリケーション内部から発行された場合にのみ、このユーザーに実際のデータが表示されます。それ以外の場合、問合せ結果はリダクションされます。

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

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

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

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

たとえば:

expression  => '1=1'

13.6 複数の名前付きポリシー式の作成および管理

名前付きの一元管理されるOracle Data Redactionポリシー式は、複数のリダクション・ポリシーで使用でき、複数の表またはビューに適用できます。

13.6.1 条件を定義するデータ・リダクション・ポリシー式について

名前付きOracle Data Redactionポリシー式は、既存のデータ・リダクション・ポリシーで使用されるポリシー式に代替するものとして機能するよう設計されています。

名前付きポリシー式では、実行時の条件に基づいてデータをリダクションできます。このポリシーのタイプは、リダイレクション・ポリシーが定義される表またはビューの列でリダクションが行われるかどうかにのみ影響します。デフォルトでは、データ・リダクション・ポリシー式は、その表またはビューに対して定義されているデータ・リダクション・ポリシーに属するすべての列に適用されます。あるいは、表またはビューの個々の列に対してポリシー式を作成して関連付けることもできます。これらの列レベル式は、名前付きポリシー式と呼ばれます。つまり、名前の付いたポリシー式のことです。名前付きポリシー式には次のプロパティがあります。

データ・リダクション・ポリシー式は次の方法で使用できます。

  • 1つのデータ・リダクション・ポリシー式を、別々のデータ・リダクション・ポリシーの一部である列に適用することによって、2つ以上のデータ・リダクション・ポリシーで共有できます。

  • 各名前付きポリシー式は、同じまたは異なる表またはビューの複数の列に関連付けることができます。

  • 各名前付きポリシー式は、同じまたは異なるデータ・リダクション・ポリシー内の列に関連付けることができます。

  • 名前付きポリシー式は、関連付けられた列のデフォルトのポリシー式をオーバーライドします。デフォルトのポリシー式は、名前付きポリシー式が適用されていないリダクション列には引き続き適用されます。

  • 名前付きポリシー式に対して行われた更新は、式のすべての列関連付けに適用されます。

  • 複数の名前付きポリシー式を同じ列に関連付けることはできません。

  • マルチテナント環境では、名前付きポリシー式を異なるプラガブル・データベース(PDB)の列に関連付けることはできません。

名前付きポリシー式を適用する列は、すでにデータ・リダクション・ポリシーでリダクションされている必要があります。名前付きポリシー式が適用された後、列をリダクションするかどうかを判断するときには、その評価の結果がデフォルトのポリシー式よりも優先されます。名前付きポリシー式を変更すると、変更はその式を使用するすべての表およびビューに適用されます。マルチテナント環境では、データ・リダクション・ポリシーと同様、名前付きポリシー式はそれが作成されたPDBにおいてのみ有効で、それが作成されたPDB内のオブジェクトの列にのみ適用できます。

表13-7は、名前付きポリシー式を作成および管理するために使用できるDBMS_REDACT PL/SQLプロシージャについて説明しています。ポリシー式についての情報を検索するには、REDACTION_EXPRESSIONSデータ・ディクショナリ・ビューを問い合せます。

表13-7 DBMS_REDACTポリシー式プロシージャ

プロシージャ 説明

DBMS_REDACT.CREATE_POLICY_EXPRESSION

データ・リダクション・ポリシー式を作成します

DBMS_REDACT.UPDATE_POLICY_EXPRESSION

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

DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL

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

DBMS_REDACT.DROP_POLICY_EXPRESSION

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

13.6.2 名前付きデータ・リダクション・ポリシー式の作成および適用

DBMS_REDACT.CREATE_POLICY_EXPRESSIONおよびDBMS_REDACT.APPLY_POLICY_EXPR_TO_COLを使用すると、名前付きデータ・リダクション・ポリシー式を作成および適用できます。

  1. COMPATIBLE初期化パラメータが12.2.0.0以上に設定されていることを確認します。
    現在の設定を確認するには、SHOW PARAMETERコマンドを使用します。
  2. ポリシー式を作成するには、DBMS_REDACT.CREATE_POLICY_EXPRESSIONプロシージャを実行します。

    たとえば:

    BEGIN
     DBMS_REDACT.CREATE_POLICY_EXPRESSION (
      policy_expression_name        => 'redact_pol',
      expression                    => '1=1',
      policy_expression_description => 'Determines whether the column will be redacted');
    END;
    /
  3. DBMS_REDACT.APPLY_POLICY_EXPR_TO_COLプロシージャを実行して、表またはビューの列にポリシー式を適用します。

    たとえば、次のように、表HR.EMPLOYEESの列SALARYにすでにデータ・リダクション・ポリシーを作成していることを想定します。

    BEGIN
      DBMS_REDACT.ADD_POLICY  (
       object_schema           => 'hr',
       object_name             => 'employees',
       policy_name             => 'overall_policy',
       expression              => '1=0'); 
    END;
    /
    BEGIN
      DBMS_REDACT.ALTER_POLICY (
       object_schema           => 'hr',
       object_name             => 'employees' ,
       policy_name             => 'overall_policy',
       function_type           => DBMS_REDACT.FULL,
       action                  => DBMS_REDACT.ADD_COLUMN,
       column_name             => 'SALARY );
    END; 
    /

    すると、次のように表SALARYにポリシー式を適用できます。

    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL (
       object_schema           => 'hr',
       object_name             => 'employees',
       column_name             => 'salary',
       policy_expression_name  => 'redact_pol');
    END;
    /

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

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

    • object_name: ポリシー式に使用する表またはビューの名前を指定します。

    • column_name: ポリシー式を適用する列を指定します。

    • policy_expression_name: ポリシー式の名前を指定します。

    Oracle Data Redactionポリシー式の作成後、これを既存のデータ・リダクション・ポリシーの一部である表またはビューの列に適用できます。

13.6.3 名前付きデータ・リダクション・ポリシー式の更新

DBMS_REDACT.UPDATE_POLICY_EXPRESSIONプロシージャを使用してデータ・リダクション・ポリシー式を更新できます。更新はただちに行われ、ポリシー式を使用するすべての列に反映されます。

REDACTION_EXPRESSIONSデータ・ディクショナリ・ビューを問い合せて、既存のデータ・リダクション・ポリシー式を検索できます。
  1. COMPATIBLE初期化パラメータが12.2.0.0以上に設定されていることを確認します。
    現在の設定を確認するには、SHOW PARAMETERコマンドを使用します。
  2. DBMS_REDACT.UPDATE_POLICY_EXPRESSIONプロシージャを実行して更新を実行します。

    たとえば:

    BEGIN
     DBMS_REDACT.UPDATE_POLICY_EXPRESSION(
      policy_expression_name => 'redact_pol',
      expression             => '1=0');
    END;
    /

13.6.4 名前付きデータ・リダクション式ポリシーの削除

DBMS_REDACT.DROP_POLICY_EXPRESSIONプロシージャを使用してデータ・リダクション式ポリシーを削除できます。

REDACTION_EXPRESSIONSデータ・ディクショナリ・ビューを問い合せて、既存のデータ・リダクション・ポリシー式を検索できます。
  1. COMPATIBLE初期化パラメータが12.2.0.0以上に設定されていることを確認します。
    現在の設定を確認するには、SHOW PARAMETERコマンドを使用します。
  2. 名前付きポリシー式の表またはビューの列との関連付けを削除します。
    既存の表またはビューの列と関連付けられている場合には、ポリシー式を削除することはできません。特定の列の名前付きポリシー式との関連付けを削除する(デフォルトのポリシー式の評価結果に基づいてその列のリダクションに戻す)には、DBMS_REDACT.APPLY_POLICY_EXPR_TO_COLプロシージャのpolicy_expression_nameパラメータをNULLに設定する必要があります。

    たとえば:

    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'employees', 
       column_name            => 'salary',
       policy_expression_name =>  null);
    END;
    /
  3. DBMS_REDACT.DROP_POLICY_EXPRESSIONを実行してポリシー式を削除します。

    たとえば:

    BEGIN
     DBMS_REDACT.DROP_POLICY_EXPRESSION(
      policy_expression_name  => 'redact_pol');
    END;
    /

13.6.5 チュートリアル: 名前付きデータ・リダクション・ポリシー式の作成および共有

このチュートリアルでは、Oracle Data Redactionポリシー式を作成して複数の表に適用し、このポリシー式を集中的に管理する方法を説明します。

13.6.5.1 ステップ1: このチュートリアル用のユーザーの作成

このチュートリアルでは、Oracle Data Redactionポリシーを作成するdr_adminと、それらをテストするhr_clerkの2人のユーザーを作成する必要があります。

このチュートリアルを開始する前に、COMPATIBLE初期化パラメータが12.2.0.0以上に設定されていることを確認します。この設定は、SHOW PARAMETERコマンドを使用して確認できます。
  1. SYSDBA管理権限を使用してユーザーSYSとしてSQL*Plusにログインします。
    sqlplus sys as sysdba
    Enter password: password
  2. マルチテナント環境で、適切なPDBに接続します。

    たとえば:

    CONNECT SYS@my_pdb AS SYSDBA
    Enter password: password

    使用可能なPDBを検索するには、show pdbsコマンドを実行します。現在のPDBを確認するには、SHOW CON_NAMEコマンドを実行します。

  3. ユーザー・アカウントdr_adminおよびhr_clerkを作成します。
    GRANT CREATE SESSION TO dr_admin IDENTIFIED BY password;
    GRANT CREATE SESSION TO hr_clerk IDENTIFIED BY password;
  4. ユーザーdr_adminEXECUTE権限を付与します。
    GRANT EXECUTE ON DBMS_REDACT TO dr_admin;
    
  5. ユーザーHRとして接続します。
    CONNECT HR --Or, for a PDB, CONNECT hr@my_pdb
    Enter password: password
  6. hr_clerkに表EMPLOYEESおよびJOBSに対するSELECT権限を付与します。
    GRANT SELECT on EMPLOYEES to hr_clerk;
    GRANT SELECT on JOBS to hr_clerk;
13.6.5.2 ステップ2: Oracle Data Redactionポリシーの作成

ユーザーdr_adminは、表HR.EMPLOYEESおよびHR.JOBSを保護するOracle Data Redactionポリシーを作成する準備ができています。

  1. ユーザーdr_adminとして接続します。
    CONNECT dr_admin --Or, for a PDB, CONNECT dr_admin@my_pdb
    Enter password: password
  2. HR.EMPLOYEES.SALARY列の完全リダクションを実行するhr_emp_redact_comp_polポリシーを作成します。
    BEGIN
     DBMS_REDACT.ADD_POLICY(
       object_schema       => 'hr', 
       object_name         => 'employees', 
       column_name         => 'salary',
       policy_name         => 'hr_emp_redact_comp_pol', 
       function_type       => DBMS_REDACT.FULL,
       expression          => '1=1');
    END;
    /
  3. hr_redact_comp_polポリシーを表HR.EMPLOYEESの列COMMISSION_PCTもリダクションするように変更します。
    BEGIN
     DBMS_REDACT.ALTER_POLICY(
       object_schema       => 'hr', 
       object_name         => 'employees', 
       policy_name         => 'hr_emp_redact_comp_pol', 
       action              => DBMS_REDACT.ADD_COLUMN,
       column_name         => 'commission_pct',
       function_type       => DBMS_REDACT.FULL,
       expression          => '1=1');
    END;
    /
  4. HR.JOBSの列max_salaryに対してhr_jobs_redact_comp_polポリシーを作成します。
    BEGIN
     DBMS_REDACT.ADD_POLICY(
       object_schema       => 'hr', 
       object_name         => 'jobs', 
       column_name         => 'max_salary',
       policy_name         => 'hr_jobs_redact_comp_pol', 
       function_type       => DBMS_REDACT.FULL,
       expression          => '1=1');
    END;
    /
この段階で、列HR.EMPLOYEES.SALARYHR.EMPLOYEES.COMMISSION_PCTおよびHR.JOBS.MAX_SALARYのデータはリダクションされます。
13.6.5.3 ステップ3: Oracle Data Redactionポリシーのテスト

ユーザーhr_clerkは、リダクションされたデータのある表を問い合せる準備ができています。

  1. ユーザーhr_clerkとして接続します。
    CONNECT hr_clerk --Or, for a PDB, CONNECT hr_clerk@my_pdb
    Enter password: password
  2. HR.EMPLOYEES表を問い合せます。
    SELECT SALARY, COMMISSION_PCT FROM HR.EMPLOYEES WHERE SALARY > 15000;
    
    出力は次のようになります。
        SALARY COMMISSION_PCT
    ---------- --------------
             0
             0
             0
    
  3. HR.JOBS表を問い合せます。
    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 15000;
    
    出力は次のようになります。
    MAX_SALARY
    ----------
             0
             0
             0
             0
             0
    
13.6.5.4 ステップ4: リダクション済の表の列へのポリシー式の作成および適用

次に、ユーザーdr_adminは、データ・リダクション・ポリシー式を作成して、それを3つのリダクション済の表の列のうちの2つに適用する準備ができています。

このポリシー式は、ユーザーhr_clerkがリダクション済のデータを表示できるようにします。
  1. ユーザーdr_admin.として接続します
    CONNECT dr_admin --Or, for a PDB, CONNECT dr_admin@my_pdb
    Enter password: password
  2. ポリシー式を作成します。
    BEGIN
     DBMS_REDACT.CREATE_POLICY_EXPRESSION(
       policy_expression_name  => 'hr_redact_pol',
       expression              => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR_CLERK''');
    END;
    /

    この式は、ユーザーhr_clerkに対してFALSEを返し、これによりユーザーhr_clerkは、データ・リダクション・ポリシーの対象となる表HR.EMPLOYEESおよびHR.JOBS内の実際のデータを表示できるようになります。

  3. hr_redact_polポリシー式を列HR.EMPLOYEES.SALARYに適用します。
    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'employees', 
       column_name            => 'salary',
       policy_expression_name => 'hr_redact_pol');
    END;
    /
  4. hr_redact_polポリシー式を列HR.JOBS.MAX_SALARYに適用します。
    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'jobs', 
       column_name            => 'max_salary',
       policy_expression_name => 'hr_redact_pol');
    END;
    /
ユーザーhr_clerkは、HR.EMPLOYEES.SALARYおよびHR.JOBS.MAX_SALARY内のデータを表示できますが、列HR.EMPLOYEES.COMMISSION_PCT内のデータはこのユーザーに対してはまだリダクションされます。
13.6.5.5 ステップ5: データ・リダクション・ポリシー式のテスト

ここでは、ユーザーhr_clerkは、hr_redact_polポリシー式をテストする準備ができています。

  1. ユーザーhr_clerkとして接続します。
    CONNECT hr_clerk --Or, for a PDB, CONNECT hr_clerk@my_pdb
    Enter password: password
  2. HR.EMPLOYEES表を問い合せます。
    SELECT SALARY, COMMISSION_PCT FROM HR.EMPLOYEES WHERE SALARY > 15000;
    
    出力は次のようになります。
        SALARY COMMISSION_PCT
    ---------- --------------
         24000
         17000
         17000
    

    これでユーザーhr_clerkは、列SALARYのデータを表示できますが、列COMMISSION_PCTのデータへはまだアクセスできません。

  3. HR.JOBS表を問い合せます。
    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 15000;
    
    出力は次のようになります。
    MAX_SALARY
    ----------
         40000
         30000
         16000
         16000
         20080

    これでユーザーhr_clerkは、列MAX_SALARYのデータを表示できます。

13.6.5.6 ステップ6: データ・リダクション・ポリシー式の変更

ユーザーdr_adminは、ユーザーhr_clerkではなくユーザーHRがリダクション済のデータにアクセスできるよう、データ・リダクション・ポリシー式を変更することを決定します。

  1. ユーザーdr_adminとして接続します。
    CONNECT dr_admin --Or, for a PDB, CONNECT dr_admin@my_pdb
    Enter password: password
  2. hr_redact_polポリシーを次のように変更します。
    BEGIN
     DBMS_REDACT.UPDATE_POLICY_EXPRESSION(
      policy_expression_name => 'hr_redact_pol',
      expression             => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR''');
    END;
    /
13.6.5.7 ステップ7: 変更済ポリシー式のテスト

ユーザーHRおよびhr_clerkは、変更済のデータ・リダクション・ポリシー式をテストする準備ができています。

  1. ユーザーHRとして接続します。
    CONNECT HR --Or, for a PDB, CONNECT HR@my_pdb
    Enter password: password
  2. HR.EMPLOYEES表を問い合せます。
    SELECT SALARY, COMMISSION_PCT FROM HR.EMPLOYEES WHERE SALARY > 15000;
    
    出力は次のようになります。
        SALARY COMMISSION_PCT
    ---------- --------------
         24000
         17000
         17000
    

    これでユーザーHRは、リダクション済のデータにアクセスできます。HRによる列HR.JOBS.MAX_SALARYへの問合せは、同様の結果が得られます。

    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 15000;
    
    MAX_SALARY
    ----------
         40000
         30000
         16000
         16000
         20080
    
  3. ユーザーhr_clerkとして接続します。
    CONNECT hr_clerk --Or, for a PDB, CONNECT hr_clerk@my_pdb
    Enter password: password
  4. HR.EMPLOYEESおよびHR.JOBSを問い合せて、結果を確認します。
    SELECT SALARY, COMMISSION_PCT FROM HR.EMPLOYEES WHERE SALARY > 15000;
    
        SALARY COMMISSION_PCT
    ---------- --------------
             0
             0
             0
    
    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 15000;
    
    MAX_SALARY
    ----------
             0
             0
             0
             0
             0
    
13.6.5.8 ステップ8: このチュートリアルのコンポーネントの削除

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

  1. ユーザーdr_adminとして接続します。
    CONNECT dr_admin --Or, for a PDB, CONNECT dr_admin@my_pdb
    Enter password: password
  2. ポリシー式を、式に関連付けられた表の列に関連付けられないように変更します。
    これを行うには、policy_expression_nameパラメータをNULLに設定する必要があります。
    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'employees', 
       column_name            => 'salary',
       policy_expression_name =>  null);
    END;
    /
    
    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'jobs', 
       column_name            => 'max_salary',
       policy_expression_name =>  null);
    END;
    /
  3. ポリシー式を削除します。
    BEGIN
     DBMS_REDACT.DROP_POLICY_EXPRESSION(
      policy_expression_name  => 'hr_redact_pol');
    END;
    /
    
  4. データ・リダクション・ポリシーhr_emp_redact_comp_polおよびhr_jobs_redact_comp_polを削除します。
    BEGIN
      DBMS_REDACT.DROP_POLICY (
        object_schema  => 'hr',
        object_name    => 'employees',
        policy_name    => 'hr_emp_redact_comp_pol');
    END;
    /
    
    BEGIN
      DBMS_REDACT.DROP_POLICY (
        object_schema  => 'hr',
        object_name    => 'jobs',
        policy_name    => 'hr_jobs_redact_comp_pol');
    END;
    /
  5. SYSTEMユーザーまたはユーザー・アカウントの削除権限を持つユーザーとして、接続します。

    たとえば:

    CONNECT SYSTEM
    Enter password: password
  6. ユーザー・アカウントdr_adminおよびhr_clerkを削除します。
    DROP USER dr_admin;
    DROP USER hr_clerk;

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

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

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

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

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

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

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

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

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);

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

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

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

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

例13-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
13.7.1.4 例: 完全にリダクションされた文字値

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

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

例13-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

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

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

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

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

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

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

13.7.2.2 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データ型の列のデフォルトの値を変更します。

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

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

  1. DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限が付与されたユーザー、およびDBAロールが付与されたユーザーなどの管理権限を持つユーザーとして、データベース・インスタンスにログインします。

  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

13.8 DBMS_REDACT.NULLIFYリダクション・ポリシーの作成

表またはビューの列の表示された値に対してNULL値を返すOracle Data Redactionポリシーを作成できます。

13.8.1 NULL値を返すポリシーの作成について

DBMS_REDACT.NULLIFY function_typeパラメータは、列内のすべてのデータをリダクションし、NULL値に置き換えます。

このファンクションのタイプは、DBMS_REDACT.FULLファンクション・タイプがサポートするすべてのサポートされる列タイプで使用できます。また、データ型CLOBおよびNCLOBもサポートします。DBMS_REDACT.NULLIFYファンクションを使用するには、最初にCOMPATIBLEパラメータが12.2.0.0以上に設定されているようにする必要があります。

13.8.2 NULL値を返すポリシー作成の構文

DBMS_REDACT.ADD_POLICYプロシージャでは、完全リダクションを実行し、リダクションされた列にNULL値を表示するリダクション・ポリシーを作成できます。

DBMS_REDACT.ADD_POLICYを使用してNULL値を返す構文は次のとおりです。

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);

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

13.8.3 例: NULL値を返すリダクション・ポリシー

DBMS_REDACT.ADD_POLICYプロシージャは、HR.EMPLOYEES表のCOMMISSION_PCT列に対してNULL値を返します。

expressionパラメータにより、EXEMPT REDACTION POLICYシステム権限を付与されているユーザーを除き、この表に問合せを行うあらゆるユーザーにポリシーが適用されます。

例13-3では、Oracle Data Redactionポリシーを作成する方法を示しています。

例13-3 NULL値を返すリダクション・ポリシー

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

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

SELECT COMMISSION_PCT FROM HR.EMPLOYEES;

COMMISSION_PCT
--------------


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

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

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

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

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

ノート:

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

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

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);

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

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

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

13.9.3.1 固定文字形式の設定

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

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

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

形式 説明

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_SIN_NUMBER

カナダ社会保険番号の先頭6桁を9 (数字)で置き換えてリダクションします。たとえば、123456789999999789にリダクションされます。

DBMS_REDACT.REDACT_SIN_UNFORMATTED

カナダ社会保険番号の先頭6桁をX (文字列)で置き換えてリダクションします。たとえば、123456789XXXXXX789にリダクションされます。

DBMS_REDACT.REDACT_SIN_FORMATTED

カナダ社会保険番号の先頭6桁をX (文字列)で置き換えてリダクションします。たとえば、123-456-789XXX-XXX-789にリダクションされます。

DBMS_REDACT.REDACT_UK_NIN_FORMATTED

英国国民保険番号の先頭6桁をX (文字列)で置き換えてリダクションしますが、英字はそのまま残します。たとえば、ET 27 02 23 DET XX XX XX Dにリダクションされます。

DBMS_REDACT.REDACT_UK_NIN_UNFORMATTED

英国国民保険番号の先頭6桁をX (文字列)で置き換えてリダクションし、英字はそのまま残します。たとえば、ET270223DETXXXXXXDにリダクションされます。

DBMS_REDACT.REDACT_CCN_FORMATTED

クレジット・カード番号(アメリカン・エキスプレス以外)を末尾4桁を残してすべて*に置き換えてリダクションします。たとえば、クレジット・カード番号5105–1051–0510–5100は、****—****—****—5100にリダクションされます。

DBMS_REDACT.REDACT_CCN_NUMBER

クレジット・カード番号(アメリカン・エキスプレス以外)を末尾4桁を残してすべて0に置き換えてリダクションします。たとえば、クレジット・カード番号5105105105105100は、************5100にリダクションされます。

DBMS_REDACT.REDACT_CCN16_F12

16桁のクレジット・カード番号(アメリカン・エキスプレス以外)を末尾4桁の表示を残してすべてリダクションします。たとえば、5105 1051 0510 5100****-****-****-5100になります。

DBMS_REDACT.REDACT_AMEX_CCN_FORMATTED

アメリカン・エキスプレス・クレジット・カード番号の末尾5桁以外の桁を*に置き換えてリダクションします。たとえば、クレジット・カード番号3782 822463 10005は、**** ****** 10005にリダクションされます。

DBMS_REDACT.REDACT_AMEX_CCN_NUMBER

アメリカン・エキスプレス・クレジット・カード番号の末尾5桁以外の桁を0に置き換えてリダクションします。たとえば、クレジット・カード番号3782 822463 10005は、0000 000000 10005にリダクションされます。

DBMS_REDACT.REDACT_ZIP_CODE

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

DBMS_REDACT.REDACT_NUM_ZIP_CODE

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

DBMS_REDACT.REDACT_DATE_EPOCH

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

DBMS_REDACT.REDACT_NA_PHONE_FORMATTED

北米の電話番号をエリア・コードを残して他をすべてXに置き換えてリダクションします。たとえば、650-555–0100650-XXX-XXXXにリダクションされます。

DBMS_REDACT.REDACT_NA_PHONE_NUMBER

北米の電話番号をエリア・コードを残して他をすべて0に置き換えてリダクションします。たとえば、6505550100650000000にリダクションされます。

DBMS_REDACT.REDACT_NA_PHONE_UNFORMATTED

北米の電話番号をエリア・コードを残して他をすべてXに置き換えてリダクションします。たとえば、6505550100650XXXXXXXにリダクションされます。

DBMS_REDACT.REDACT_DATE_MILLENNIUM

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

関連項目:

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

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

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

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

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

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

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

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

13.9.4.1 文字データ型の設定

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

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

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

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

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

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

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

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

13.9.5.1 数値データ型の設定

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

数値データ型の部分リダクションの場合、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プロシージャの一般的な構文を参照してください。

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

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

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

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

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

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

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

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

13.9.6.1 日時データ型の設定

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

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

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

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

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

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

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

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

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

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

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

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

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

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

13.10.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形式を指定します。

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

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

13.10.3.1 正規表現の形式

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

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

表13-9 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に置換されます。

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

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

関連項目:

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

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

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

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

例13-8 正規表現データ・リダクション文字値

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_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

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

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

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

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

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

例13-9では、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

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

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;
/

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

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

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

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

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);

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

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

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

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

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

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

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

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

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

リダクション・タイプ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です。

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

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

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

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

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

13.13 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ロールが付与されたユーザーはリダクション・ポリシーから除外されます。

13.14 Oracle Data Redactionポリシーの変更

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

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

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

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

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

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

13.14.2 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 (列の説明を変更する場合)

関連項目:

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

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

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

表13-11 様々な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

13.14.4 チュートリアル: 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 support_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;

13.15 複数列のリダクション

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

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

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

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

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

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

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

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

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

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

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;
/

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

Oracle Data Redactionポリシーは、必要に応じて無効化してから再度有効化できます。

13.16.1 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: 無効化するポリシーの名前を指定します。

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

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

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

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

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: 有効化するポリシーの名前を指定します。

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

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

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

13.17 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プロシージャを実行した後、削除はすぐに有効になります。

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

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

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

13.18 チュートリアル: 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;
    /

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

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

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

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

表13-12 データ・リダクション・ビュー

ビュー 説明

REDACTION_COLUMNS

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

REDACTION_EXPRESSIONS

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

REDACTION_POLICIES

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

REDACTION_VALUES_FOR_TYPE_FULL

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