Oracle Data Redactionポリシーでは、表の列タイプおよび使用するリダクションのタイプに応じて、列でデータをどのようにリダクションするかを定義します。ポリシーは必要に応じて有効および無効にできます。
この項の内容は次のとおりです。
Oracle Data Redactionポリシーでは、表またはビューでリダクションが発生する条件を定義します。
データ・リダクション・ポリシーには、次のような特徴があります。
データ・リダクション・ポリシーは、実行するリダクションの種類、リダクションの出現方法およびリダクションを実行するタイミングを定義します。Oracle Databaseは、実行時に、データがアプリケーションに戻される直前にリダクションを実行します。
データ・リダクション・ポリシーでは、値の完全なリダクション、部分的なリダクション、ランダムなリダクションが可能です。さらに、テスト環境でポリシーをテストする場合には、データをまったくリダクションしないようにデータ・リダクション・ポリシーを定義することもできます。
データ・リダクション・ポリシーは、ポリシー式がTRUEまたはFALSEのどちらを返すかに基づいて、異なるアプリケーション・ユーザーにリダクションされたデータまたは実際のデータのいずれかの表示を許可するポリシー式で定義できます。ポリシー式の評価のブール結果がTRUEであると、リダクションが実行されます。セキュリティ上の理由から、ポリシー式で使用できる関数および演算子は、SYS_CONTEXTなどの少数に限定されています。ユーザー作成関数は使用できません。ポリシー式では、SYS_SESSION_ROLES名前空間とSYS_CONTEXT関数を組み合せて使用し、有効なロールを確認できます。
表5-1に、DBMS_REDACTパッケージのプロシージャを示します。
表5-1 DBMS_REDACTプロシージャ
| プロシージャ | 説明 |
|---|---|
|
|
データ・リダクション・ポリシーを表またはビューに追加します |
|
|
データ・リダクション・ポリシーを変更します |
|
|
指定されたデータ型の完全にリダクションされた値をグローバルに更新します。データベース・インスタンスを再起動すると、更新された値を使用できます。 |
|
|
データ・リダクション・ポリシーを有効化します |
|
|
データ・リダクション・ポリシーを無効化します |
|
|
データ・リダクション・ポリシーを削除します |
|
関連項目: DBMS_REDACT PL/SQLパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 |
リダクション・ポリシーを作成するには、DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限が必要です。ポリシーで保護される基礎となる表やビューにアクセスする場合、権限は一切必要ありません。
Oracle Data Redactionポリシーを作成する前に、データに最適なデータ・リダクション・プロセスを計画することが重要です。
DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限が付与されていることを確認してください。
リダクションする表またはビューの列のデータ型を決定します。
この列がOracle Virtual Private Database (VPD) 行フィルタ処理条件で使用されていないことを確認してください。つまり、VPDポリシー関数によって生成されるVPD述語の一部であってはなりません。
実行するリダクションのタイプ(完全、ランダム、部分、正規表現またはなし)を決定します。
データ・リダクション・ポリシーを適用するユーザーを決定します。
この情報に基づいて、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に設定しました。
fbrownがmpike.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は、ビュー・チェーンの最初のビューのポリシーを使用します。ビューでのデータ・リダクション・ポリシーの使用に関する詳細は、「例: Oracle Data Redactionが表およびビューに与える影響」の項を参照してください。
列を指定しない場合(たとえば、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_pattern、regexp_replace_string、regexp_position、regexp_position、regexp_occurrence、regexp_match_parameter: 正規表現を使用してデータを完全に、または部分的にリダクションできます。実際のデータにregexp_patternに一致するものがない場合は完全リダクションが実行されるので、regexp_patternを指定するときは注意してください。列のすべての値が、使用している正規表現のセマンティクスに一致しているか確認します。詳細は、「正規表現ベースのリダクション・ポリシーを作成する構文」を参照してください。
Oracle Data Redactionポリシーを作成する場合は、DBMS_REDACT.ADD_POLICYプロシージャでexpressionパラメータを使用して、ポリシーが適用される条件を指定する必要があります。
この項の内容は次のとおりです。
DBMS_REDACT.ADD_POLICYプロシージャのexpressionパラメータには、リダクションが実行される前にTRUEに評価される必要のあるブール式を定義します。
この式は次のいずれかのファンクションに基づいている必要があります。
指定された名前領域を使用するSYS_CONTEXT。SYS_CONTEXTのデフォルトの名前空間は、SESSION_USERおよびCLIENT_IDENTIFIERなどの値を含むUSERENVです。(この関数の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。)使用できるもう一つの名前空間は、各ロールの属性を含むSYS_SESSION_ROLES名前空間です。
次のOracle Application Expressファンクション:
APEX_UTIL.GET_SESSION_STATEファンクションのラッパーであるV
NV、APEX_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権限を持つユーザーでは、すべてのデータ・リダクション・ポリシーがバイパスされるため、問合せの結果はリダクションされないことに注意してください。データ・リダクション・ポリシーから除外されるユーザーの詳細は、次を参照してください。
ユーザーSYSおよびEXEMPT REDACTION POLICY権限を持つユーザーでは、すべてのデータ・リダクション・ポリシーがバイパスされるため、問合せの結果はリダクションされないことに注意してください。データ・リダクション・ポリシーから除外されるユーザーの詳細は、「Oracle Data Redactionポリシーからのユーザーの除外」を参照してください。
セッション・ユーザー名やクライアント識別子などのユーザー環境に基づくデータ・リダクション・ポリシーを適用するために、DBMS_REDACT.ADD_POLICY expressionパラメータで、SYS_CONTEXTファンクションのUSERENV名前空間を使用できます。
例5-1では、セッション・ユーザー名psmithのみにポリシーを適用する方法を示します。
例5-1 セッション・ユーザー名によるユーザーのフィルタリング
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''PSMITH'''
|
関連項目: SYS_CONTEXTファンクションで使用できる名前空間の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
データ・リダクション・ポリシーをデータベース・ロールに基づいて適用するには、各ロールの属性が含まれている、SYS_CONTEXTファンクションのSYS_SESSION_ROLES名前空間を使用します。指定されたロールが、問合せを行ったアプリケーション・ユーザーに対して有効化されている場合、属性の値はTRUEで、ロールが有効化されていない場合、属性の値はFALSEです。
たとえば、スーパーバイザのみに実際のデータの表示を許可するとします。例5-2では、DBMS_REDACT.ADD_POLICY expressionパラメータを使用してポリシーを設定し、supervisorロールが有効化されているアプリケーション・ユーザーには実際のデータを表示し、他のすべてのアプリケーション・ユーザーにはデータをリダクションする方法を示します。
Oracle Application Express (APEX)セッション・ステートに基づいてデータ・リダクション・ポリシーを適用するには、次に示すパブリックApplication Express APIのいずれかをDBMS_REDACT.ADD_POLICY expressionパラメータに使用します。
たとえば、これらのようなファンクションを使用することにより、APEXアプリケーションのセッション・ステートに格納されているジョブまたは権限ロールに基づいてデータをリダクションできます。
例5-3では、G_JOBというアプリケーション項目の値がCLERKとなったときにリダクションを発生させる場合に、DBMS_REDACT.ADD_POLICYのexpressionパラメータを設定する方法を説明しています。
問合せユーザーがAPEXアプリケーションのコンテキストにないとき(問合せがAPEXフレームワーク外、たとえばSQL*Plusから直接発行されたとき)にリダクションを発生させる場合は、次のようにIS NULL句を使用します。このポリシー式を使用すると、mavisというユーザーの問合せがAPEXアプリケーション内部から発行された場合にのみ、このユーザーに実際のデータが表示されます。それ以外の場合、問合せ結果はリダクションされます。
expression => 'V(''APP_USER'') != ''mavis@example.com'' or V(''APP_USER'') is null'
|
関連項目: Oracle Application Express APIリファレンス |
フィルタリングを使用しなければ、コンテキストに関係なくポリシーを任意のユーザーに適用できます。ただし、ユーザーSYSおよびEXEMPT REDACTION POLICY権限を持つユーザーは常にOracle Data Redactionポリシーから除外されることに注意してください。SYS以外のユーザーまたはEXEMPT REDACTION POLICY権限が付与されていないユーザーにポリシーを適用するには、例5-4に示すように、TRUEに評価されるDBMS_REDACT.ADD_POLICY expressionパラメータを記述します。
この項の内容は次のとおりです。
この項の内容は次のとおりです。
完全データ・リダクション・ポリシーでは、データ列のすべての内容がリダクションされます。リダクション・ポリシーを完全に設定するには、function_typeパラメータをDBMS_REDACT.FULLに設定する必要があります。デフォルトでは、NUMBERデータ型の列はゼロ(0)で、文字データ型の列は1つのスペース( )で置き換えられます。DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを使用することにより、このデフォルトを変更できます。
完全データ・リダクション・ポリシーを作成する場合のフィールドは次のとおりです。
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_schema、object_name、column_name、policy_name、expression、enable: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」を参照してください。
function_type: リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.FULLと入力します。
function_typeパラメータを省略する場合、デフォルトのリダクションfunction_type設定は、DBMS_REDACT.FULLです。
列のデータ型は、使用が許可されているfunction_type設定を決定することに注意してください。「データ型に基づいた完全、部分およびランダム・リダクションの比較」を参照してください。
例5-5に、HR.EMPLOYEES表のCOMMISSION_PCT列にすべての値の完全なリダクションを使用する方法を示します。式パラメータは、EXEMPT REDACTION POLICYシステム権限が付与されているユーザーは除き、表の問合せを行った任意のユーザーにポリシーを適用します。(EXEMPT REDACTION POLICYシステム権限の詳細は、「Oracle Data Redactionポリシーからのユーザーの除外」を参照してください。)
例5-5 完全データ・リダクション・ポリシー
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
例5-6では、mavis.cust_info表のuser_id列のユーザーIDを完全にリダクションする方法を示しています。user_id列は、VARCHAR2データ型です。出力は空白の文字列です。expression設定により、MGRロールのあるユーザーは、ユーザーIDを表示できます。
例5-6 完全にリダクションされたデータ・リダクション文字値
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プロシージャを使用してこの値を変更します。
この項の内容は次のとおりです。
完全データ・リダクションを使用するデータ・リダクション・ポリシーで表示されるデフォルトの値を変更できます。任意のデータ型のデフォルトの完全リダクションの任意の値を別の値に変更する場合は、次のリストに示すように、そのデータ型に適用される方法を使用できます。
列のデータ型がLOB以外のデータ型(BINARY_FLOAT、BINARY_DOUBLE、CHAR、VARCHAR2、NCHAR、NVARCHAR2、DATE、TIMESTAMPまたはTIMESTAMP WITH TIME ZONE)である場合は、DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを使用する必要があります(「LOB以外のデータ型の列に対するデフォルトの完全データ・リダクション値の変更」を参照)。
列のデータ型がLOBデータ型(BLOB、CLOBまたはNCLOB)である場合は、UPDATE文を実行する必要があります(「LOBデータ型の列に対するデフォルトの完全データ・リダクション値の変更」を参照)。
値を有効にするには、変更した後に、データベースを再起動する必要があります。現在の値を検索するには、REDACTION_VALUES_FOR_TYPE_FULLデータ・ディクショナリ・ビューを問い合せます。
この変更は、完全なデータ・リダクションを使用するデータベースのすべてのデータ・リダクション・ポリシーに影響することに注意してください。デフォルトの完全データ・リダクション値を変更する前に、既存の完全データ・リダクション・ポリシーにこの変更が及ぼす影響を確認してください。
LOB以外のデータ型の列に対するデフォルトの完全データ・リダクション値を変更するには、DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを使用します。
DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限が付与されたユーザーとして、データベース・インスタンスにログインします。
(オプション)変更する値を確認します。
たとえば、NUMBERデータ型を使用する列の現在の値を確認します。
SELECT NUMBER_VALUE FROM REDACTION_VALUES_FOR_TYPE_FULL;
NUMBER_VALUE
------------
0
DBMS_REDACT.UPDATE_FULL_REDACTION_VALUESプロシージャを実行して値を変更します。
次の構文を使用します。
EXEC DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES (datatype_value => new_value);
たとえば、NUMBER列を変更し、デフォルトとして7を使用するには、次のようにします。
EXEC DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES (number_val => 7);
他のデータ型の場合、datatype_valueを次の設定に置き換え、new_valueを、使用する値に置き換えます。
| データ型 | new_value設定 | |
|---|---|---|
BINARY_FLOAT |
binfloat_val |
|
BINARY_DOUBLE |
bindouble_val |
|
CHAR |
char_val |
|
VARCHAR2 |
varchar_val |
|
NCHAR |
nchar_val |
|
NVARCHAR2 |
nvarchar_val |
|
DATE |
date_val |
|
TIMESTAMP |
ts_val |
|
TIMESTAMPWITHTIMEZONE |
tswtz_val |
データベース・インスタンスを再起動します。
次に例を示します。
SHUTDOWN IMMEDIATE STARTUP
|
関連項目:
|
LOBデータ型の列に対するデフォルトの完全データ・リダクション値を変更するには、次のようにします。
RADM_FPTM_LOB$データ・ディクショナリ表を更新する権限を持つユーザーとして、データベース・インスタンスにログインします。
(オプション)REDACTION_VALUES_FOR_TYPE_FULLデータ・ディクショナリ・ビューに問い合せて、変更する値を確認します。
LOB値を更新します。
BLOBデータ型の場合、BLOBデータ型の新しい完全データ・リダクション値の変数(blob_valなど)を初期化します。次に、RADM_FPTM_LOB$表のBLOBVAL列のUPDATE文を実行し、BLOBデータ型の列の完全リダクションの新しいデフォルトの値を設定します。
DECLARE
blob_val BLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(blob_val, TRUE);
DBMS_LOB.WRITE(blob_val, 8, 1, UTL_RAW.CAST_TO_RAW('newvalue'));
UPDATE RADM_FPTM_LOB$ SET BLOBCOL = BLOB_VAL WHERE FPVER = 1;
DBMS_LOB.FREETEMPORARY(blob_val);
END;
/
CLOBデータ型の場合、CLOBデータ型の新しい完全データ・リダクション値の変数(clob_valなど)を初期化します。次に、RADM_FPTM_LOB$表のCLOBVAL列のUPDATE文を実行し、CLOBデータ型の列の完全リダクションの新しいデフォルトの値を設定します。
DECLARE clob_val CLOB; BEGIN DBMS_LOB.CREATETEMPORARY(clob_val, TRUE); DBMS_LOB.WRITE(clob_val, 8, 1, 'newvalue'); UPDATE RADM_FPTM_LOB$ SET CLOBCOL = CLOB_VAL WHERE FPVER = 1; DBMS_LOB.FREETEMPORARY(clob_val); END; /
NCLOBデータ型の場合、NCLOBデータ型の新しい完全データ・リダクション値の変数(nclob_valなど)を初期化します。次に、RADM_FPTM_LOB$表のNCLOBVAL列のUPDATE文を実行し、NCLOBデータ型の列の完全リダクションの新しいデフォルトの値を設定します。
DECLARE nclob_val NCLOB; BEGIN DBMS_LOB.CREATETEMPORARY(nclob_val, TRUE); DBMS_LOB.WRITE(nclob_val, 8, 1, N'newvalue'); UPDATE RADM_FPTM_LOB$ SET NCLOBCOL = NCLOB_VAL WHERE FPVER = 1; DBMS_LOB.FREETEMPORARY(nclob_val); END; /
データベース・インスタンスを再起動します。
次に例を示します。
SHUTDOWN IMMEDIATE STARTUP
|
関連項目: REDACTION_VALUES_FOR_TYPE_FULLビューの詳細は、『Oracle Databaseリファレンス』を参照してください。 |
この項の内容は次のとおりです。
データの部分リダクションでは、ID番号の最初の5桁など、データの一部のみがリダクションされます。たとえば、クレジット・カードの番号の大半(最後の4桁以外)をアスタリスク(*)でリダクションできます。文字、数値または日時のデータ型を使用する列に対してポリシーを作成できます。文字データ型をリダクションするポリシーの場合には、固定文字リダクションのショートカットを使用できます。
部分リダクション・ポリシーを作成する場合の 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);
次のように指定します。
object_schema、object_name、column_name、policy_name、expression、enable: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」の項を参照してください。
function_type: リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.PARTIALと入力します。
function_parameters: ここで設定するパラメータは、column_nameパラメータに指定された列のデータ型によって異なります。詳細は次の項を参照してください。
DBMS_REDACT.ADD_POLICY function_parametersパラメータを使用することにより、固定文字ショートカットを使用できるようになります。
この項の内容は次のとおりです。
表5-2では、該当する列にVARCHAR2またはNUMBERデータ型のいずれかが使用される一般にリダクションされる社会保障番号、郵便番号、およびクレジット・カードに対して使用することができるDBMS_REDACT.ADD_POLICY function_parametersパラメータ・ショートカットについて説明します。
表5-2 部分固定文字リダクションのショートカット
| ショートカット | 説明 |
|---|---|
|
|
列が |
|
|
列が |
|
|
列が |
|
|
列が |
|
|
列が |
|
|
列が |
|
|
列が |
|
|
列が |
|
|
|
|
|
すべての日付を |
|
|
最後の4桁は表示したまま、16桁のクレジット・カード番号をリダクションします。たとえば、 |
例5-7 では、VARCHAR2データ型の列にある社会保障番号をREDACT_US_SSN_F5ショートカットによってリダクションする方法について説明します。
例5-7 部分的にリダクションされた文字値
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パラメータを使用することにより、文字データ型をリダクションできるようになります。
この項の内容は次のとおりです。
DBMS_REDACT.ADD_POLICYのfunction_parametersパラメータを設定して文字データ型の部分リダクションを定義するときは、次の順序で次の設定の値を入力します。各値はカンマで区切ります。
|
注意: 部分リダクションには、固定幅の文字セットを使用する必要があることに注意してください。つまり、リダクションされる各文字は、バイト長が等しい別の文字に置換される必要があります。可変長の文字セット(たとえば、UTF-8)を使用する場合、正規表現ベースのリダクションを使用する必要があります。詳細は、「正規表現ベースのリダクション・ポリシーを作成する構文」を参照してください。 |
設定は次のとおりです。
入力形式: データが現在どのようにフォーマットされているかを指定します。クレジット・カード番号の全桁など、リダクションされる可能性のある各文字にVを入力します。クレジット・カード番号のハイフンまたは空白のような書式化文字を使用して書式化する場合、Fを入力します。各文字に、対応するVまたはF値があるか確認します。(入力形式の値は大/小文字を区別しません。)
出力形式: 表示されるデータを書式化する方法を定義します。リダクションされる可能性のある各文字にVを入力します。入力形式の各文字Fをハイフンなど表示される文字に使用する文字に置換します。(出力形式の値は大/小文字を区別しません。)
マスク文字: リダクションに使用する文字を指定します。アスタリスク(*)など、リダクションに使用する単一の文字を入力します。
開始する数字位置: リダクションで開始するVの数字位置を指定します。
終了する数字位置: リダクションで終了するVの数字位置を指定します。終了する位置の値を決めるときは、Fの位置を含めないでください。
たとえば、次の設定は、クレジット・カード番号5105 1051 0510 5100の最初の12桁のVをリダクションし、Fの位置(空白)をハイフンに置換することでクレジット・カード番号で通常使用されるスタイルに書式化し、その結果****-****-****-4320と表示されます。
function_parameters => 'VVVVFVVVVFVVVVFVVVV,VVVV-VVVV-VVVV-VVVV,*,1,12',
例5-8には、VARCHAR2データ型の列にある社会保障番号をリダクションする方法と、社会保障番号に含まれているハイフンを保持する方法を示します。
例5-8 部分的にリダクションされたデータ・リダクションの文字値
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パラメータについて、次の設定項目の値を記載されている順番に入力します。
マスク文字: 表示する文字を指定します。0から9までの数値を入力します。
開始する数字位置: 最初の数字に1を指定するなど、リダクションで開始するの数字位置を指定します。
終了する数字位置: リダクションで終了する数字位置を指定します。
たとえば、次の設定は、社会保障番号987654321の最初の5桁をリダクションし、その結果、999994321と表示されます。
function_parameters => '9,1,5',
例5-9では、mavis.cust_info表の一連の社会保障番号を、ログインした任意のアプリケーション・ユーザーに対して部分リダクションする方法を示しています。(そのため、expressionパラメータはTRUEと評価されます。)このシナリオでは、社会保障番号はデータ型NUMBERの列にあります。つまり、ssn列に含まれるのは数字のみで、ハイフンまたは空白など他の文字は含まれせん。
例5-9 部分的にリダクションされたデータ・リダクションの数値
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パラメータを使用することにより、日時データ型をリダクションできるようになります。
この項の内容は次のとおりです。
日時データ型の部分リダクションの場合、次のDBMS_REDACT.ADD_POLICY function_parametersパラメータ設定項目の値を、記載されている順番に入力します。
m: 月をリダクションします。月の名前でリダクションするには、1から12を小文字のmに追加します。たとえば、m5は、MAYと表示されます。リダクションを省略するには、大文字のMを入力します。
d: 月の日をリダクションします。月の日でリダクションするには、1から31を小文字のdに追加します。たとえば、d7は、07と表示されます。月の日よりも大きい数値(たとえば、2月に31を入力)を入力すると、その月の最終日(たとえば、28)が表示されます。リダクションを省略するには、大文字のDを入力します。
y: 年をリダクションします。年でリダクションするには、1から9999を小文字のyに追加します。たとえば、y1984は、84と表示されます。リダクションを省略するには、大文字のYを入力します。
h: 時間をリダクションします。時間でリダクションするには、0から23を小文字のhに追加します。たとえば、h20は、20と表示されます。リダクションを省略するには、大文字のHを入力します。
m: 分をリダクションします。分でリダクションするには、0から59を小文字のmに追加します。たとえば、m30は、30と表示されます。リダクションを省略するには、大文字のMを入力します。
s: 秒をリダクションします。秒でリダクションするには、0から59を小文字のsに追加します。たとえば、s45は、45と表示されます。リダクションを省略するには、大文字のSを入力します。
例5-10では、日付を部分的にリダクションする方法を示しています。この例では顧客の誕生年をリダクションし、それを13に置き換え、残りの値はそのまま保持します。
例5-10 日時値を使用した部分リダクションによるデータ・リダクション
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フィールドは次のとおりです。
DBMS_REDACT.ADD_POLICY (
object_schema IN VARCHAR2 := NULL,
object_name IN VARCHAR2,
column_name IN VARCHAR2 := NULL,
policy_name IN VARCHAR2,
function_type IN BINARY_INTEGER := NULL,
expression IN VARCHAR2,
enable IN BOOLEAN := TRUE,
regexp_pattern IN VARCHAR2 := NULL,
regexp_replace_string IN VARCHAR2 := NULL,
regexp_position IN BINARY_INTEGER := 1,
regexp_occurrence IN BINARY_INTEGER := 0,
regexp_match_parameter IN VARCHAR2 := NULL);
次のように指定します。
object_schema、object_name、column_name、policy_name、expression、enable: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」を参照してください。
function_type: リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.REGEXPと入力します。
次の点に注意してください。
function_typeパラメータをDBMS_REDACT.REGEXPに設定すると、function_parametersパラメータを省略します。
正規表現(regexp_pattern、regexp_replace、regexp_position、regexp_occurrenceおよびregexp_match_parameter)を、pattern、replace、position、occurrenceおよび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パラメータの両方に対してショートカットを使用できます。
この項の内容は次のとおりです。
表5-3では、DBMS_REDACT.ADD_POLICYプロシージャ内のregexp_patternパラメータで使用できるショートカットについて説明します。
表5-3 regexp_patternパラメータのショートカット
| ショートカット | 説明 |
|---|---|
|
|
任意の桁と一致します。 regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_X, この設定によって、一致した任意の桁が 次の設定では、一致した任意の桁が regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_1, |
|
|
このショートカットで使用する必要のある適切な |
|
|
このショートカットで使用する必要のある適切な |
|
|
このショートカットで使用できる適切な
|
|
|
このショートカットで使用する必要のある適切な |
表5-4では、DBMS_REDACT.ADD_POLICYプロシージャ内のregexp_replace_stringパラメータで使用できるショートカットについて説明します。
表5-4 regexp_replace_stringパラメータのショートカット
| ショートカット | 説明 |
|---|---|
|
|
|
|
|
|
|
|
クレジット・カード番号の中央の桁を、 |
|
|
米国の電話番号の最後の7桁を、 |
|
|
電子メール・アドレスを、 |
|
|
電子メール・ドメイン名を、 |
|
|
IPアドレスの最後の3桁を、 |
例5-11では、正規表現ショートカットを使用してクレジット・カード番号をリダクションする方法を示しています。
例5-11 正規表現データ・リダクション文字値
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
データ・リダクション・ポリシーで正規表現をカスタマイズできます。
この項の内容は次のとおりです。
カスタム正規表現リダクション・ポリシーを作成するには、DBMS_REDACT.ADD_POLICYプロシージャで次のパラメータを使用します。
regexp_pattern: このパターンは通常テキスト・リテラルであり、データ型はCHAR、VARCHAR2、NCHARまたはNVARCHAR2のいずれかになります。パターンには、 512バイトまで入力できます。regexp_patternパラメータの正規表現を記述する方法の詳細は、『Oracle Database SQL言語リファレンス』にあるREGEXP_REPLACE SQL関数のpattern引数の説明を参照してください(データ・リダクションがサポートする正規表現の一致は、REGEXP_REPLACE SQL関数のものとよく似ているため)。
regexp_replace_string: データ型はCHAR、VARCHAR2、NCHARまたはNVARCHAR2のいずれかになります。regexp_replace_stringには、最大500個の部分正規表現への後方参照を\nという書式で指定でき、nは、1から9の数値です。regexp_replace_string設定にバックスラッシュ(\)を含める場合、その前にエスケープ文字(これもバックスラッシュ)を付ける必要があります。たとえば、一致したパターンを文字どおり\2に置換するには(それを一致したパターンで2番目に一致した部分正規表現に置換するのではない場合)、regexp_replace_string設定に\\2を入力します。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
例5-12では、emp_id列データをリダクションする正規表現の使用方法を示しています。次の例では、regexp_patternパラメータとregexp_replace_stringパラメータが組み合されて、最初に9桁のパターンが検索されます。参照用に、それらは最初の3桁、次の2桁、最後の4桁を含む3つのグループに分割されます。その後、9桁すべてが、元のパターンで検索された3番目のグループ(最後の4桁)と連結されたXXXXXに置換されます。
例5-12 正規表現を使用した部分的にリダクションされたデータ・リダクション
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; /
問合せおよびリダクションされた結果:
SELECT emp_id FROM mavis.cust_info; EMP_ID ------------ XXXXX1234 XXXXX5678
この項の内容は次のとおりです。
ランダム・リダクション・ポリシーでは、リダクション済のデータが、列のデータ型に応じて、表示されるたびにランダムに生成された値として、問合せを行ったアプリケーション・ユーザーに表示されます。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_schema、object_name、column_name、policy_name、expression、enable: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」を参照してください。
function_type: リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.RANDOMと入力します。
function_typeパラメータを省略する場合、デフォルトのリダクションfunction_type設定は、DBMS_REDACT.FULLです。
列のデータ型は、使用が許可されているfunction_type設定を決定することに注意してください。「データ型に基づいた完全、部分およびランダム・リダクションの比較」を参照してください。
例5-13では、ランダム値の生成方法を示しています。SELECT文を実行するたびに、出力は異なります。
例5-13 ランダムにリダクションされたデータ・リダクションの値
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を指定するオプションでは、リダクション・ポリシーが定義された表に対する問合せの結果に影響を与えずに、ポリシーの内部動作をテストできます。このオプションを使用して、リダクション・ポリシー定義を本番環境に適用する前にテストできます。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_schema、object_name、column_name、policy_name、expression、enable: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」を参照してください。
function_type: データ・リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.NONEと入力します。
function_typeパラメータを省略する場合、デフォルトのリダクションfunction_type設定は、DBMS_REDACT.FULLです。
例5-14では、表示されている値のいずれもリダクションしないデータ・リダクション・ポリシーの生成方法を示しています。
例5-14 リダクションされないデータ・リダクション値
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ポリシーを適用しないように、ユーザーを除外することができます。そのためには、そのユーザーにEXEMPT REDACTION POLICYシステム権限を付与します。この権限は信頼できるユーザーにのみ付与してください。
また、この権限を付与されているユーザーに加え、ユーザーSYSも、すべてのデータ・リダクション・ポリシーから除外されます。データ・リダクション・ポリシーを作成するユーザーは、そのユーザーがユーザーSYSであるか、またはEXEMPT REDACTION POLICYシステム権限が付与されている場合を除き、デフォルトでは、データ・リダクション・ポリシーから除外されません。
次の点に注意してください。
表に対するINSERT権限があるユーザーは、データ・リダクション・ポリシーがテーブルに存在するかどうかにかかわらず、リダクションされた列に値を挿入できます。データ・リダクションは、ユーザーが発行したSQL SELECT文(つまり、問合せ)のみに影響しし、ユーザーが発行するその他のSQL(INSERT、UPDATEまたは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ロールが付与されたユーザーはリダクション・ポリシーから除外されます。
DBMS_REDACT.ALTER_POLICYプロシージャを使用すると、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 ( 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 (列の説明を変更する場合)。
表5-5では、様々なDBMS_REDACT.ALTER_POLICYの操作の実行に必要なパラメータの組合せを示しています。
表5-5 様々なDBMS_REDACT.ALTER_POLICYの操作に必要なパラメータ
| 変更内容 | 設定パラメータ |
|---|---|
|
列の追加または変更 |
|
|
ポリシー式の変更 |
|
|
ポリシーの説明の変更 |
|
|
列の説明の変更 |
|
|
列の削除 |
|
この項の演習は、データ・リダクション・ポリシーを変更して、複数の列をリダクションする方法を示しています。また、ポリシーのexpression設定を変更する方法も示しています。これを実行するには、各段階でDBMS_REDACT.ALTER_POLICYプロシージャを実行する必要があります。
ポリシーを作成します。
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'hr', object_name => 'employees', column_name => 'email', policy_name => 'hr_employees_pol', function_type => DBMS_REDACT.FULL, expression => '1=1'); END; /
この時点で、アプリケーション・ユーザー(HRを含む)がemail列を問い合せると、電子メール・アドレスがリダクションされ、空白が1つ表示されます。
CONNECT HR
Enter password: password
SELECT EMAIL FROM HR.EMPLOYEES;
EMAIL
------
このポリシーを変更し、hire_date列をリダクションして01-JAN-70を表示します。
BEGIN DBMS_REDACT.ALTER_POLICY( object_schema => 'hr', object_name => 'employees', policy_name => 'hr_employees_pol', action => DBMS_REDACT.ADD_COLUMN, column_name => 'hire_date', function_type => DBMS_REDACT.PARTIAL, function_parameters => DBMS_REDACT.REDACT_DATE_EPOCH); END; /
hire_date列をリダクションするには、function_typeパラメータを変更して部分リダクションを使用する必要があり、function_parametersパラメータを含めてDBMS_REDACT.REDACT_DATE_EPOCHショートカットを指定する必要があります。この特定の変更では、expressionパラメータは変更する必要がないため、省略されます。email列はリダクションされたままであるため、問合せは次のように表示されます。
SELECT EMAIL, HIRE_DATE FROM HR.EMPLOYEES;
EMAIL HIRE_DATE
------ ----------
01-JAN-70
ユーザーHRが、EMAILおよびHIRE_DATE列に実際のデータを表示できる唯一のユーザーになるように、expressionパラメータを変更します。
BEGIN
DBMS_REDACT.ALTER_POLICY(
object_schema => 'hr',
object_name => 'employees',
policy_name => 'hr_employees_pol',
action => DBMS_REDACT.MODIFY_EXPRESSION,
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR''');
END;
/
expression設定を変更するには、actionパラメータをDBMS_REDACT.MODIFY_EXPRESSIONに設定し、次に新しい式をexpressionパラメータに入力します。この段階では、ユーザーHRがEMAILおよびHIRE_DATE列を問い合せると、ユーザーは実際のデータを表示できます。
SELECT EMAIL, HIRE_DATE FROM HR.EMPLOYEES; EMAIL HIRE_DATE ------ ---------- SKING 17-JUN-03 ...
ポリシーを削除するには、プロシージャを次のように入力します。
BEGIN
DBMS_REDACT.DROP_POLICY (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'hr_employees_pol');
END;
/
データ・リダクション・ポリシーで2つ以上の列をリダクションできます。これを行うには、リダクションする最初の列に対するポリシーを作成します。その後、DBMS_REDACT.ALTER_POLICYプロシージャを使用して、次の列を追加します。必要に応じて、action、column_name、function_typeおよびfunction_parametersパラメータ(またはregexp_で始まるパラメータ)を設定して、新しい列に対するリダクションを定義しますが、object_schema、object_name、policy_nameまたはexpressionパラメータは変更しないでください。リダクションされた各列には、それを作成するために使用したのと同じリダクション・パラメータが引き続き使用されます。
例5-15では、既存のデータ・リダクション・ポリシーに列を追加する方法を示しています。この例のactionパラメータは、DBMS_REDACT.ADD_COLUMNを使用して新しい列を追加する必要があることを定義しています。新しい列の名前であるcard_numは、column_nameパラメータによって設定されます。
例5-15 データ・リダクション・ポリシーへの列の追加
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;
/
作成したデータ・リダクション・ポリシーは、必要に応じて無効化することも再度有効化することもできます。
この項の内容は次のとおりです。
データ・リダクション・ポリシーを無効化するには、DBMS_REDACT.DISABLE_POLICYプロシージャを使用します。REDACTION_POLICIESビューのPOLICY_NAMEおよびENABLE列を問い合せると、既存のデータ・リダクション・ポリシーの名前およびそれらが有効化されているかがわかります。ただし、ポリシーが存在している場合は、元のポリシーが無効化されていても表またはビューに他のポリシーを作成することはできません。つまり、同じ表の列に別のポリシーを作成する場合、最初のポリシーを削除してから新しいポリシーを作成して使用する必要があります。
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: 無効化するポリシーの名前を指定します。
例5-16では、データ・リダクション・ポリシーを無効化する方法を示しています。
データ・リダクション・ポリシーを有効化するには、DBMS_REDACT.ENABLE_POLICYプロシージャを使用します。新しいポリシーを作成した後、それを有効化する必要はなく、作成プロセスによって処理されることに注意してください。既存のデータ・リダクション・ポリシーの名前およびそれらが有効化されているかを確認するには、REDACTION_POLICIESビューのPOLICY_NAMEおよびENABLE列を問い合せます。プロシージャを実行した後、すぐに有効になります。
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: 有効化するポリシーの名前を指定します。
例5-17では、データ・リダクション・ポリシーを有効化する方法を示しています。
データ・リダクション・ポリシーを削除するには、DBMS_REDACT.DROP_POLICYプロシージャを使用します。既存のデータ・リダクション・ポリシーの名前を確認するには、REDACTION_POLICIESビューのPOLICY_NAME列を問い合せます。ポリシーは、削除するときに有効化または無効化できます。プロシージャを実行した後、削除はすぐに有効になります。
Oracle Data Redactionポリシーに関連付けられた表またはビューを削除すると、ポリシーは自動的に削除されます。ベスト・プラクティスは、まずポリシーを削除し、その後、表またはビューを削除することです。詳細は、「ごみ箱が有効になっている場合のポリシーの削除」を参照してください。
データ・リダクション・ポリシーを削除する構文は次のとおりです。
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: 削除するポリシーの名前を指定します。
例5-18では、データ・リダクション・ポリシーを削除する方法を示しています。
Oracle Data Redactionポリシーは、ターゲットの表またはビュー、およびマテリアライズド・ビューなど、このターゲットに作成された任意のビューに適用されます。(マテリアライズド・ビューでデータ・リダクション・ポリシーを作成する場合の制限事項は、「マテリアライズド・ビューに対するポリシーの作成」を参照してください。)ビュー・チェーン(別のビューに基づいたビュー)を作成した場合、データ・リダクション・ポリシーはこのビュー・チェーンにも適用されます。ポリシーはこのビュー・チェーン全体に適用されますが、これらのビューのいずれかに別のポリシーが作成された場合、影響を受ける後続のビューの列には、この新しいポリシーが優先されて適用されます。
この概念の機能を理解するには、次の例を試してください。
次の表を作成および入力します。
CREATE TABLE TABLE1 (TC1 VARCHAR2(20), TN1 NUMBER(10));
INSERT INTO TABLE1 VALUES ('5111-1111-1111-1118', 987654329);
次のビューを作成して、表table1のビュー・チェーンを構成します。
CREATE VIEW view1 (vc1, vn1) AS SELECT tc1, tn1 FROM table1; CREATE VIEW view2 (vc2, vn2) AS SELECT vc1, vn1 FROM view1; CREATE VIEW view3 (vc3, vn3) AS SELECT vc2, vn2 FROM view2;
表table1に次のポリシーを作成して、tc1列の表示をランダム値に変更します。
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'NULL', object_name => 'table1', column_name => 'tc1', policy_name => 't1pol', function_type => DBMS_REDACT.RANDOM, expression => '1=1'); END; /
table1.tc1、view1.vc1、view2.vc2およびview3.vc3を問い合せると、これらすべては、t1polデータ・リダクション・ポリシーに基づいてランダムな出力を生成します。
次に例を示します。
SELECT vc3 FROM view3; VC3 ----------------------- M,v]3(z+U4~e;0#3]<'
view2に次のポリシーを作成して、何も表示されないよう列vc2の出力を変更します(つまり、空白を出力します)。
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'NULL', object_name => 'view2', column_name => 'vc2', policy_name => 'v2pol', function_type => DBMS_REDACT.FULL, expression => '1=1'); END; /
ビューview2およびview3を問い合せます。
SELECT vc2 FROM view2; SELECT vc3 FROM view3;
いずれの問合せも同じ出力(空白)を生成し、これらのビューでは、ポリシーv2polがベース表のポリシーt1polをどのようにオーバーライドするかを示します。
表table1およびビューview1を問い合せます。
SELECT tc1 FROM table1; SELECT vc1 FROM view1;
table1およびview1は、チェーン内での優先度が低いため、これらは、ポリシーv2pol1の影響を受けません。いずれにも、ランダムな値が出力されます。
view1に次のポリシーを作成して、列vn1の数値の最初の5桁を9にリダクションします。
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'NULL', object_name => 'view1', column_name => 'vn1', policy_name => 'v1pol', function_type => DBMS_REDACT.PARTIAL, function_parameters => '9,1,5', expression => '1=1'); END; /
ビューview1を問い合せます。
SELECT vc1, vn1 FROM view1; VC1 VN1 ------------------------------------- ---------------- :'F6`B<dB/N>hJDlJ7V 999994329
ここでは、ビューview1は2つのポリシーを使用しています。ポリシーt1pol (表table1)は、引き続き列vc1をリダクションし、ポリシーv1pol (ビューview1)は列vn1をリダクションします。
ビューview2を問い合せます。
SELECT vc2, vn2 FROM view2;
VC2 VN2
------------------------------------- ----------------
999994329
ビューview2でも、2つのポリシーを使用しています(ポリシーv2polは、列vc2の空白文字を生成し、ビューview1のポリシーv1polはvn2の数値を部分リダクションします)。
ビューview3を問い合せます。
SELECT vc3, vn3 FROM view3;
VC3 VN3
------------------------------------- ----------------
999994329
ビューview3は、直接適用されるポリシーがないため、view1およびview2の両方のポリシー設定を使用します。そのため、出力はview2の出力と同じです。
ポリシーを無効にします。
ポリシーを無効化した場合、ポリシーの影響を受けるビュー・チェーンのすべてのビューの出力も変更されます。
たとえば、表table1に作成されたポリシーt1polを無効化します。
EXEC DBMS_REDACT.DISABLE_POLICY (NULL, 'TABLE1', 'T1POL');
ここで、もう一度view1を問い合せます。
SELECT vc1, vn1 FROM view1; VC1 VN1 ------------------------------------- ---------------- 5111-1111-1111-1118 999994329
列vc1には、ベース表table1の値が表示されます。列vn1には、ポリシーv2polによってリダクションされた値が引き続き表示されます。
この演習のコンポーネントを削除するには、次のように実行します。
EXEC DBMS_REDACT.DROP_POLICY (NULL, 'table1', 't1pol'); EXEC DBMS_REDACT.DROP_POLICY (NULL, 'view1', 'v1pol'); EXEC DBMS_REDACT.DROP_POLICY (NULL, 'view2', 'v2pol'); DROP TABLE table1; DROP VIEW view1; DROP VIEW view2; DROP VIEW view3;
図5-1では、これらのポリシーが、前の例で説明しているビュー・チェーンに与える影響を示しています。
|
関連項目: ごみ箱が有効になっている場合にOracle Data Redactionポリシーに関連付けられた表またはビューを削除したときのデータ・リダクション・ポリシーが受ける影響の詳細は、「ごみ箱が有効になっている場合のポリシーの削除」を参照してください。 |
SQL式を使用して、Oracle Data Redactionポリシーが定義された列に基づくレポートを作成できます。SQL式に使用される値はリダクションされます。このリダクションはSQL式が評価される前に実行され、レポートに表示される結果の値は、リダクションされたSQL式の結果全体ではなく、リダクションされた値に対して評価されたSQL式の最終結果になります。
たとえば、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; /
HRスキーマにログインし、次に、従業員の給料と歩合を組み合せるためのSQL式(SALARY + COMMISSION_PCT)を使用した次のレポートを実行します。
SELECT (SALARY + COMMISSION_PCT) total_emp_compensation
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 80;
TOTAL_EMP_COMPENSATION
----------------------
9999.9
9999.95
99990.95
...
レポートには、連結など様々なSQL式を使用できます。次に例を示します。
SELECT 'Employee ID ' || EMPLOYEE_ID ||
' has a salary of ' || SALARY ||
' and a commission of ' || COMMISSION_PCT || '.' detailed_emp_compensation
FROM 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.
...
表5-6では、データ・リダクション・ポリシーに関する情報を提供するデータ・ディクショナリ・ビューの一覧を表示しています。これらのビューを問い合せる前に、SELECT_CATALOG_ROLEロールを付与する必要があります。
表5-6 データ・リダクション・ビュー
| ビュー | 説明 |
|---|---|
|
|
データベースのリダクションされたすべての列を示し、存在する列内の表またはビューの所有者、オブジェクト名、列名、リダクション関数のタイプ、リダクション関数に対するパラメータ(該当する場合)およびリダクション・ポリシーの説明の情報を提供します。 |
|
|
データベースのすべてのデータ・リダクション・ポリシーを示します。これには、オブジェクトの所有者、オブジェクト名、ポリシー名、ポリシー式およびポリシーが有効かどうかに関する情報と、データ・リダクション・ポリシーの説明が含まれます。 |
|
|
完全リダクションを使用するデータ・リダクション・ポリシーの現在のリダクション値を表示します。 |