3.15 Oracle Data Redactionポリシーの変更
DBMS_REDACT.ALTER_POLICY
プロシージャでは、Oracle Data Redactionポリシーを変更できます。
3.15.1 Oracle Data Redactionポリシーの変更について
DBMS_REDACT.ALTER_POLICY
プロシージャは、データ・リダクション・ポリシーを変更します。
ポリシーがすでに有効化されている場合は、最初に無効化する必要はなく、またポリシーを変更した後でもポリシーは有効化された状態が維持されます。
REDACTION_POLICIES
データ・ディクショナリ・ビューのPOLICY_NAME
列を問い合せて、既存のデータ・リダクション・ポリシーの名前を検索したり、REDACTION_COLUMNS
ビューを問い合せて、ポリシー内に指定された列、関数およびパラメータに関する情報を検索できます。完全データ・リダクションを使用するポリシーを現在の値から検索するには、REDACTION_VALUES_FOR_TYPE_FULL
データ・ディクショナリ・ビューを問い合せます。
action
パラメータは、実行する変更の型を指定します。このプロシージャを実行するときは、少なくともobject_name
およびpolicy_name
パラメータを含める必要があります。
3.15.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,
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 := 1,
regexp_occurrence IN BINARY_INTEGER := 0,
regexp_match_parameter IN VARCHAR2 := NULL,
policy_description IN VARCHAR2 := NULL,
column_description IN VARCHAR2 := NULL);
COMPATIBLE
データベース初期化パラメータを23以上に設定した後に、function_type
パラメータに値DBMS_REDACT.FULL
を指定して実行し、ブール・データ型の列でデータ・リダクション・ポリシーを初めて変更して完全リダクション・ポリシーに変換すると、REDACTION_VALUES_FOR_TYPE_FULL
のカタログ・ビューにBOOLEAN_VALUE
列が表示され、BOOLCOL
列がSYS.RADM_FPTM$
データ・ディクショナリ表に表示されます。
ここでは次のように指定します:
-
action
: 次のいずれかの値を1つ選択し、使用するアクションの種類を定義します。-
DBMS_REDACT.ADD_COLUMN
((ポリシーですでに保護されている列に加えて)リダクションのために新しい列を追加する場合)この設定はaction
パラメータのデフォルトです。 -
DBMS_REDACT.MODIFY_COLUMN
(function_parameters
、regexp_*
パラメータ、またはfunction_type
でのリダクション・タイプを変更する予定の場合) -
DBMS_REDACT.DROP_COLUMN
(列からリダクションを削除する場合)。 -
DBMS_REDACT.MODIFY_EXPRESSION
(expression
の値を変更する場合)各ポリシーに指定できるポリシー式は1つのみです。つまり、ポリシー式を変更する際は、既存のポリシー式を新しいポリシー式で置換します。表の各列には、異なる名前付きポリシー式を指定できます。(複数の名前付きポリシー式を作成および管理できます。)名前付きポリシー式は、
DBMS_REDACT.UPDATE_POLICY_EXPRESSION
を使用することで変更できます。DBMS_REDACT.MODIFY_EXPRESSION
の使用によって名前付きポリシー式を変更することはできません。 -
DBMS_REDACT.SET_POLICY_DESCRIPTION
(ポリシーの説明を変更する場合) -
DBMS_REDACT.SET_COLUMN_DESCRIPTION
(列の説明を変更する場合)
-
3.15.3 DBMS_REDACT.ALTER_POLICY操作に必要なパラメータ
DBMS_REDACT.ALTER_POLICY
プロシージャには、列の追加や変更などの様々な操作を実行できるパラメータが用意されています。
表3-12では、これらのパラメータの組合せを示します。
表3-12 様々なDBMS_REDACT.ALTER_POLICYの操作に必要なパラメータ
変更内容 | 設定パラメータ |
---|---|
列の追加 |
|
列の変更 |
|
列の削除 |
|
ポリシー式の変更 |
|
ポリシーの説明の変更 |
|
列の説明の変更 |
|
3.15.4 チュートリアル: Oracle Data Redactionポリシーの変更
列ごとにそれ固有のリダクション設定および名前付きポリシー式を使用して、表内やビュー内の複数の列をリダクションできます。
この項の演習は、データ・リダクション・ポリシーを変更して、複数の列をリダクションする方法を示しています。また、ポリシーのexpression
設定を変更する方法も示しています。これを実行するには、各段階でDBMS_REDACT.ALTER_POLICY
プロシージャを実行する必要があります。
-
ユーザーの作成およびそれらのユーザーへの権限の付与を行う権限を持つユーザーとして、PDBに接続します。
-
次のユーザーを作成します。
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;
-
ユーザー
dr_admin
に、DBMS_REDACT
PL/SQLパッケージに対するEXECUTE
を付与します。GRANT EXECUTE ON DBMS_REDACT TO dr_admin;
- ユーザー
dr_admin
に、ADMINISTER REDACTION POLICY
システム権限を付与します。GRANT ADMINISTER REDACTION POLICY TO dr_admin;
-
ユーザー
OE
として接続します。 -
顧客のクレジット・カード情報を含む表を作成し移入します。
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 varchar2(19), cc_exp varchar2(7)); INSERT INTO cust_order_info VALUES ('Jane','Doe','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');
-
ユーザー
sales_rep
およびsupport_rep
に、表cust_order_info
に対するSELECT
権限を付与します。GRANT SELECT ON cust_order_info TO sales_rep, support_rep;
-
ユーザー
dr_admin
として接続します。 -
ポリシーを有効期限のリダクションを含めるよう変更します。
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); END; /
-
ユーザー
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; /
-
ポリシーをテストするために、2人のユーザーに表
cust_order_info
を問い合せさせます。まず、
support_rep
で接続し、表を問い合せます。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
は実際のデータを表示できます。次に、sales_rep
で接続し、表を問い合せます。SELECT cc_num, cc_exp FROM OE.cust_order_info; CC_NUM CC_EXP ---------------- ------- ************5100 lST=033 ************1118 OZA.w4C ************5454 B(9+;O1
データは、ユーザー
sales_rep
用にリダクションされています。 -
support_rep
のみにリダクション済データが表示され、sales_rep
には実際のデータが表示されるようにする条件を含めるよう、ユーザーdr_admin
でcust_order_info
を変更します。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; /
-
ユーザーに再度ポリシーをテストさせます。
まず、
support_rep
でポリシーをテストします:SELECT cc_num, cc_exp FROM OE.cust_order_info; CC_NUM CC_EXP ---------------- ------- ************5100 1^XMF~` ************1118 qz+9=#S ************5454 *KCaUkm
これで実際のデータがリダクションされるため、ユーザー
support_rep
はこのデータを表示できなくなります。次に、
sales_rep
で接続し、表を問い合せます。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
は実際のデータを表示できます。 -
このチュートリアルのコンポーネントが不要になった場合、それらを削除できます。
dr_admin
で接続し、ポリシーを削除します。BEGIN DBMS_REDACT.DROP_POLICY ( object_schema => 'oe', object_name => 'cust_order_info', policy_name => 'redact_cust_cc_info'); END; /
セキュリティ管理者で接続し、ユーザーを削除します。
DROP USER dr_admin; DROP USER sales_rep; DROP USER support_rep;
ユーザー
OE
で接続し、cust_order_info
表を削除します。DROP TABLE cust_order_info;