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 データ・リダクション・ビュー
ビュー | 説明 |
---|---|
|
データベースのリダクションされたすべての列を示し、存在する列内の表またはビューの所有者、オブジェクト名、列名、リダクション関数のタイプ、リダクション関数に対するパラメータ(該当する場合)およびリダクション・ポリシーの説明の情報を提供します。 |
|
データベースのすべてのデータ・リダクション・ポリシーを示します。これには、オブジェクトの所有者、オブジェクト名、ポリシー名、ポリシー式およびポリシーが有効かどうかに関する情報と、データ・リダクション・ポリシーの説明が含まれます。 |
|
完全リダクションを使用するデータ・リダクション・ポリシーの現在のリダクション値を表示します。 |