reductionポリシーのexpression句を工夫することでユーザーごとにポリシーの適用、非適用を制御することが可能です。
下記の例ではスキーマユーザーのtestとtest2が存在しているとします。
[oracle@DB01 ~]$ sqlplus test/password@localhost/pdb1.test.local
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
SET linesize 300
SELECT *
FROM test.payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 1111111111111234 ####-####-####-1234 01-1月 -2017 123
2 4001 1111111111112345 ####-####-####-2345 01-1月 -2017 234
3 4002 1111111111113456 ####-####-####-3456 01-1月 -2017 345
4 4003 1111111111114567 ####-####-####-4567 01-1月 -2017 456
5 4004 1111111111115678 ####-####-####-5678 01-1月 -2017 567
[oracle@DB01 ~]$ sqlplus test2/password@localhost/pdb1.test.local
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
SET linesize 300
SELECT *
FROM test.payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 1111111111111234 ####-####-####-1234 01-1月 -2017 123
2 4001 1111111111112345 ####-####-####-2345 01-1月 -2017 234
3 4002 1111111111113456 ####-####-####-3456 01-1月 -2017 345
4 4003 1111111111114567 ####-####-####-4567 01-1月 -2017 456
5 4004 1111111111115678 ####-####-####-5678 01-1月 -2017 567
通常はtestユーザーもtest2ユーザーも同じポリシーが適用されます。
BEGIN
DBMS_REDACT.alter_policy (
object_schema => 'test',
object_name => 'payment_details',
policy_name => 'redact_card_info',
action => DBMS_REDACT.modify_expression,
column_name => 'card_no',
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''TEST'''
);
END;
/
alter_policy句で既存のポリシーを変更します。
「SYS_CONTEXT(''USERENV'',''SESSION_USER'')」は現在sessionを保持しているユーザーを表します。
このユーザーが「test」ではないときにポリシーが実行されます。
[oracle@DB01 ~]$ sqlplus test/password@localhost/pdb1.test.local
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
SET linesize 300
SELECT *
FROM test.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ユーザーではポリシーが適用されていません。
[oracle@DB01 ~]$ sqlplus test2/password@localhost/pdb1.test.local
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
SET linesize 300
SELECT *
FROM test.payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 1111111111111234 ####-####-####-1234 01-1月 -2017 123
2 4001 1111111111112345 ####-####-####-2345 01-1月 -2017 234
3 4002 1111111111113456 ####-####-####-3456 01-1月 -2017 345
4 4003 1111111111114567 ####-####-####-4567 01-1月 -2017 456
5 4004 1111111111115678 ####-####-####-5678 01-1月 -2017 567
test2ユーザーでポリシーが適用されました。
下記の例ではスキーマユーザーのtestとtest2が存在しているとします。
[oracle@DB01 ~]$ sqlplus test/password@localhost/pdb1.test.local
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
SET linesize 300
SELECT *
FROM test.payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 1111111111111234 ####-####-####-1234 01-1月 -2017 123
2 4001 1111111111112345 ####-####-####-2345 01-1月 -2017 234
3 4002 1111111111113456 ####-####-####-3456 01-1月 -2017 345
4 4003 1111111111114567 ####-####-####-4567 01-1月 -2017 456
5 4004 1111111111115678 ####-####-####-5678 01-1月 -2017 567
[oracle@DB01 ~]$ sqlplus test2/password@localhost/pdb1.test.local
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
SET linesize 300
SELECT *
FROM test.payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 1111111111111234 ####-####-####-1234 01-1月 -2017 123
2 4001 1111111111112345 ####-####-####-2345 01-1月 -2017 234
3 4002 1111111111113456 ####-####-####-3456 01-1月 -2017 345
4 4003 1111111111114567 ####-####-####-4567 01-1月 -2017 456
5 4004 1111111111115678 ####-####-####-5678 01-1月 -2017 567
通常はtestユーザーもtest2ユーザーも同じポリシーが適用されます。
BEGIN
DBMS_REDACT.alter_policy (
object_schema => 'test',
object_name => 'payment_details',
policy_name => 'redact_card_info',
action => DBMS_REDACT.modify_expression,
column_name => 'card_no',
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''TEST'''
);
END;
/
alter_policy句で既存のポリシーを変更します。
「SYS_CONTEXT(''USERENV'',''SESSION_USER'')」は現在sessionを保持しているユーザーを表します。
このユーザーが「test」ではないときにポリシーが実行されます。
[oracle@DB01 ~]$ sqlplus test/password@localhost/pdb1.test.local
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
SET linesize 300
SELECT *
FROM test.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ユーザーではポリシーが適用されていません。
[oracle@DB01 ~]$ sqlplus test2/password@localhost/pdb1.test.local
ALTER SESSION SET nls_date_format='DD-MON-YYYY';
COLUMN card_no FORMAT 9999999999999999
SET linesize 300
SELECT *
FROM test.payment_details
ORDER BY id;
ID CUSTOMER_ID CARD_NO CARD_STRING EXPIRY_DATE SEC_CODE VALID_DATE
---------- ----------- ----------------- ------------------- ---------------- ---------- ----------------
1 4000 1111111111111234 ####-####-####-1234 01-1月 -2017 123
2 4001 1111111111112345 ####-####-####-2345 01-1月 -2017 234
3 4002 1111111111113456 ####-####-####-3456 01-1月 -2017 345
4 4003 1111111111114567 ####-####-####-4567 01-1月 -2017 456
5 4004 1111111111115678 ####-####-####-5678 01-1月 -2017 567
test2ユーザーでポリシーが適用されました。

コメント