12cの新機能、Data Redactionはデータをリアルタイムに変換する機能です。
変換すると言ってもデータを直接書き換えるのではなく、クライアントに見えるところだけを書き換える形になります。
また、データを直接書き換えるわけではないので、負荷は低いようです。
まずは準備から
[oracle@DB01 ~]$ sqlplus sys/password@localhost/pdb1.test.local as sysdba
SQL> GRANT EXECUTE ON sys.dbms_redact TO test;
権限付与が成功しました。
testというユーザーを作り、パッケージdbms_redactを実行できる権限を与えます。
[oracle@DB01 ~]$ sqlplus test/password@localhost/pdb1.test.local
SQL> DROP TABLE payment_details PURGE;
DROP TABLE payment_details PURGE
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。
CREATE TABLE payment_details (
id NUMBER NOT NULL,
customer_id NUMBER NOT NULL,
card_no NUMBER NOT NULL,
card_string VARCHAR2(19) NOT NULL,
expiry_date DATE NOT NULL,
sec_code NUMBER NOT NULL,
valid_date DATE,
CONSTRAINT payment_details_pk PRIMARY KEY (id)
);
INSERT INTO payment_details VALUES (1, 4000, 1234123412341234, '1234-1234-1234-1234', TRUNC(ADD_MONTHS(SYSDATE,12)), 123, NULL);
INSERT INTO payment_details VALUES (2, 4001, 2345234523452345, '2345-2345-2345-2345', TRUNC(ADD_MONTHS(SYSDATE,12)), 234, NULL);
INSERT INTO payment_details VALUES (3, 4002, 3456345634563456, '3456-3456-3456-3456', TRUNC(ADD_MONTHS(SYSDATE,12)), 345, NULL);
INSERT INTO payment_details VALUES (4, 4003, 4567456745674567, '4567-4567-4567-4567', TRUNC(ADD_MONTHS(SYSDATE,12)), 456, NULL);
INSERT INTO payment_details VALUES (5, 4004, 5678567856785678, '5678-5678-5678-5678', TRUNC(ADD_MONTHS(SYSDATE,12)), 567, NULL);
COMMIT;
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
set linesize 200
SELECT *
FROM payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 1234123412341234 1234-1234-1234-1234 06-7月 -2017 123
2 4001 2345234523452345 2345-2345-2345-2345 06-7月 -2017 234
3 4002 3456345634563456 3456-3456-3456-3456 06-7月 -2017 345
4 4003 4567456745674567 4567-4567-4567-4567 06-7月 -2017 456
5 4004 5678567856785678 5678-5678-5678-5678 06-7月 -2017 567
testスキーマにpayment_detailsという表を作成し、データを挿入します。
BEGIN
DBMS_REDACT.add_policy(
object_schema => 'test',
object_name => 'payment_details',
column_name => 'card_no',
policy_name => 'redact_card_info',
function_type => DBMS_REDACT.full,
expression => '1=1'
);
END;
/
データが準備出来たので、redactionを体験してみます。
パッケージDBMS_REDACTのadd_policyプロシージャを実行し、置き換えのポリシーを作成します。
上記では、特定の列(card_no)全データ(expression => '1=1')を型ごとに決められているデフォルト値に置き換える(function_type => DBMS_REDACT.full,)ポリシーを作成します。
number値の置き換えデフォルト値は「0(ゼロ)」です。
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
set linesize 200
SELECT *
FROM payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 0 1234-1234-1234-1234 06-7月 -2017 123
2 4001 0 2345-2345-2345-2345 06-7月 -2017 234
3 4002 0 3456-3456-3456-3456 06-7月 -2017 345
4 4003 0 4567-4567-4567-4567 06-7月 -2017 456
5 4004 0 5678-5678-5678-5678 06-7月 -2017 567
置き換え後、再度SQLを実行してみると・・・
card_no列が全て0になっていました。
しかし、データは実際には書き換えられていないことに注意してください。
変換すると言ってもデータを直接書き換えるのではなく、クライアントに見えるところだけを書き換える形になります。
また、データを直接書き換えるわけではないので、負荷は低いようです。
まずは準備から
[oracle@DB01 ~]$ sqlplus sys/password@localhost/pdb1.test.local as sysdba
SQL> GRANT EXECUTE ON sys.dbms_redact TO test;
権限付与が成功しました。
testというユーザーを作り、パッケージdbms_redactを実行できる権限を与えます。
[oracle@DB01 ~]$ sqlplus test/password@localhost/pdb1.test.local
SQL> DROP TABLE payment_details PURGE;
DROP TABLE payment_details PURGE
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。
CREATE TABLE payment_details (
id NUMBER NOT NULL,
customer_id NUMBER NOT NULL,
card_no NUMBER NOT NULL,
card_string VARCHAR2(19) NOT NULL,
expiry_date DATE NOT NULL,
sec_code NUMBER NOT NULL,
valid_date DATE,
CONSTRAINT payment_details_pk PRIMARY KEY (id)
);
INSERT INTO payment_details VALUES (1, 4000, 1234123412341234, '1234-1234-1234-1234', TRUNC(ADD_MONTHS(SYSDATE,12)), 123, NULL);
INSERT INTO payment_details VALUES (2, 4001, 2345234523452345, '2345-2345-2345-2345', TRUNC(ADD_MONTHS(SYSDATE,12)), 234, NULL);
INSERT INTO payment_details VALUES (3, 4002, 3456345634563456, '3456-3456-3456-3456', TRUNC(ADD_MONTHS(SYSDATE,12)), 345, NULL);
INSERT INTO payment_details VALUES (4, 4003, 4567456745674567, '4567-4567-4567-4567', TRUNC(ADD_MONTHS(SYSDATE,12)), 456, NULL);
INSERT INTO payment_details VALUES (5, 4004, 5678567856785678, '5678-5678-5678-5678', TRUNC(ADD_MONTHS(SYSDATE,12)), 567, NULL);
COMMIT;
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
set linesize 200
SELECT *
FROM payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 1234123412341234 1234-1234-1234-1234 06-7月 -2017 123
2 4001 2345234523452345 2345-2345-2345-2345 06-7月 -2017 234
3 4002 3456345634563456 3456-3456-3456-3456 06-7月 -2017 345
4 4003 4567456745674567 4567-4567-4567-4567 06-7月 -2017 456
5 4004 5678567856785678 5678-5678-5678-5678 06-7月 -2017 567
testスキーマにpayment_detailsという表を作成し、データを挿入します。
BEGIN
DBMS_REDACT.add_policy(
object_schema => 'test',
object_name => 'payment_details',
column_name => 'card_no',
policy_name => 'redact_card_info',
function_type => DBMS_REDACT.full,
expression => '1=1'
);
END;
/
データが準備出来たので、redactionを体験してみます。
パッケージDBMS_REDACTのadd_policyプロシージャを実行し、置き換えのポリシーを作成します。
上記では、特定の列(card_no)全データ(expression => '1=1')を型ごとに決められているデフォルト値に置き換える(function_type => DBMS_REDACT.full,)ポリシーを作成します。
number値の置き換えデフォルト値は「0(ゼロ)」です。
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
set linesize 200
SELECT *
FROM payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 0 1234-1234-1234-1234 06-7月 -2017 123
2 4001 0 2345-2345-2345-2345 06-7月 -2017 234
3 4002 0 3456-3456-3456-3456 06-7月 -2017 345
4 4003 0 4567-4567-4567-4567 06-7月 -2017 456
5 4004 0 5678-5678-5678-5678 06-7月 -2017 567
置き換え後、再度SQLを実行してみると・・・
card_no列が全て0になっていました。
しかし、データは実際には書き換えられていないことに注意してください。





















