在11G要遮蔽 Table 欄位時,需要建立 View 來讓 User 無法看到某些欄位的機密資料,現在12C有個新功能叫" Data Redaction ",無須建立View只要下指令就可以達到遮蔽的效果,這個功能只在用戶端進行資料遮蔽並不會引響原來的資料。
就像以下這樣
原本
新增限制後
這樣具有隱私性的資料就會被遮蔽起來,只顯示後面的數字
*要注意的是User 擁有 EXP_FULL_DATABASE 以及 DBA 權限時,遮蔽則無效
這個功能是使用 DBMS_REDACT 包來做管理
ADD_POLICY: Add a redaction policy to a table.
DROP_POLICY: Remove a redaction policy from a table.
ALTER_POLICY: Change a redaction policy.
ENABLE_POLICY: Enable a redaction policy after it is disabled.
DISABLE_POLICY: Disable a redaction policy.
對於資料遮蔽,Oracle 提供了很多種遮蔽效果,以下來一一做示範
先建立測試Table
SQL> CREATE TABLE test.test_Redaction
2 (
3 t_id NUMBER,
4 t_name VARCHAR2(50),
5 t_add VARCHAR2(50),
6 t_phone VARCHAR2(50),
7 t_time DATE
8 )
9 ;
已建立表格.
SQL> INSERT INTO TEST_REDACTION VALUES (101,'jimmy','senior program','7458-9658-3256',sysdate);
已建立 1 個資料列.
SQL> INSERT INTO TEST_REDACTION VALUES (102,'mike','general man','1236-6541-3214',sysdate);
已建立 1 個資料列.
SQL> INSERT INTO TEST_REDACTION VALUES (103,'eva','assistant','3574-1596-9856',sysdate);
已建立 1 個資料列.
SQL>
SQL> select * from test_redaction;
T_ID T_NAME T_ADD T_PHONE T_TIME
---------- ---------- --------------- --------------- -------------------
101 jimmy senior program 7458-9658-3256 2014-08-21 02:15:52
102 mike general man 1236-6541-3214 2014-08-21 02:17:12
103 eva assistant 3574-1596-9856 2014-08-21 02:17:13
進行第一個遮蔽效果 "full",對於文字類型欄位顯示出來為空白,對於日期類型欄位顯示為2001-01-01,對於數字類型欄位顯式為0
BEGIN
DBMS_REDACT.ADD_POLICY (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY',
column_name => 'T_ADD',
function_type => DBMS_REDACT.FULL,
expression => '1=1',
enable => TRUE
);
END;
/
SQL> select * from test.test_redaction;
T_ID T_NAME T_ADD T_PHONE T_TIME
---------- ---------- --------------- --------------- -------------------
101 jimmy 7458-9658-3256 2014-08-21 02:15:52
102 mike 1236-6541-3214 2014-08-21 02:17:12
103 eva 3574-1596-9856 2014-08-21 02:17:13
第二個效果是"PARTIAL",可以自訂function_parameters參數來顯示出我們指定的樣式
BEGIN
DBMS_REDACT.ALTER_POLICY (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY',
column_name => 'T_PHONE',
action => DBMS_REDACT.MODIFY_COLUMN,
function_type => DBMS_REDACT.PARTIAL,
function_parameters => 'VVVVFVVVVFVVVV,VVVV-VVVV-VVVV,*,1,6' --*為替代得文字,從第1個文字開始到第6個文字都遮蔽
);
END;
/
SQL> select * from test.test_redaction;
T_ID T_NAME T_ADD T_PHONE T_TIME
---------- ---------- --------------- --------------- -------------------
101 jimmy ****-**58-3256 2014-08-21 02:15:52
102 mike ****-**41-3214 2014-08-21 02:17:12
103 eva ****-**96-9856 2014-08-21 02:17:13
SQL>
要為數字類型遮蔽時,替代符號只能使用1-9
數字範例
BEGIN
DBMS_REDACT.ALTER_POLICY (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY',
column_name => 'T_ID',
action => DBMS_REDACT.ADD_COLUMN,
function_type => DBMS_REDACT.PARTIAL,
function_parameters => '1,1,5'
);
END;
/
BEGIN
dbms_redact.alter_policy (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY',
column_name => 'T_TIME',
action => dbms_redact.MODIFY_COLUMN,
function_type => DBMS_REDACT.PARTIAL,
function_parameters => 'Md15y2010HMS',
expression => '1=1');
END;
/
Md15y2010HMS > 顯示出來的日期一率為15 ,年一率為2010 ,前面的英文小寫才有效果
MDYHMS > 月日年時分秒 , 此為固定格式
第三個效果是"RANDOM",對於文字與數字會變成具有相同長度的隨機文字與數字,對於日期會變成隨機日期,上述說的隨機都不會與原來的相同
BEGIN
DBMS_REDACT.ALTER_POLICY (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY',
column_name => 'T_PHONE',
action => DBMS_REDACT.MODIFY_COLUMN,
function_type => DBMS_REDACT.RANDOM
);
END;
/
SQL> select * from test.test_redaction;
T_ID T_NAME T_ADD T_PHONE T_TIME
---------- ---------- --------------- --------------- -------------------
101 jimmy senior program >*}$Y5n_F2&,a= 2014-08-21 02:15:52
102 mike general man x.eIMi:A!6mQUq 2014-08-21 02:17:12
103 eva assistant *`"*PE#g2h*2XM 2014-08-21 02:17:13
SQL>
第四種是"REGEXP"使用 正規表達式是來規範
Data Redaction 功能還可以設定只對哪些 User 進行遮蔽
BEGIN
DBMS_REDACT.ALTER_POLICY (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY',
column_name => 'T_PHONE',
action => DBMS_REDACT.MODIFY_EXPRESSION,
expression => 'SYS_CONTEXT ( ''USERENV'',''SESSION_USER'' ) = ''jimmy''');
END;
/
對於jimmy這個User進行遮蔽,其他User則可以看到全部內容
取消欄位的遮蔽
BEGIN
DBMS_REDACT.ALTER_POLICY (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY',
column_name => 'T_ADD',
action => DBMS_REDACT.MODIFY_COLUMN,
function_type => DBMS_REDACT.NONE
);
END;
/
新增其他欄位的遮蔽
BEGIN
DBMS_REDACT.ALTER_POLICY (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY',
column_name => 'T_NAME',
action => DBMS_REDACT.ADD_COLUMN,
function_type => DBMS_REDACT.FULL
);
END;
/
刪除Table的遮蔽
BEGIN
DBMS_REDACT.DROP_POLICY (
object_schema => 'CHECK_DB',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY');
END;
/
資料的遮蔽對於 where 的條件有無影響?!
原始資料
SQL> select * from test.test_redaction;
T_ID T_NAME T_ADD T_PHONE T_TIME
---------- --------------- --------------- --------------- -------------------
101 jimmy senior program 7458-9658-3256 2014-08-21 02:15:52
102 mike general man 1236-6541-3214 2014-08-21 02:17:12
103 eva assistant 3574-1596-9856 2014-08-21 02:17:13
對遮蔽後的資料進行select
SQL> select * from test.test_redaction where t_id =101;
T_ID T_NAME T_ADD T_PHONE T_TIME
---------- ---------- --------------- --------------- -------------------
111 jimmy senior program 7458-9658-3256 2014-08-21 02:15:52
SQL> select * from test.test_redaction where t_id =102;
T_ID T_NAME T_ADD T_PHONE T_TIME
---------- ---------- --------------- --------------- -------------------
111 mike general man 1236-6541-3214 2014-08-21 02:17:12
由此可以判斷資料在處理後,在客戶端這邊才進行遮蔽。
可以對利用create table select * from 方式把資料複製出去?!
SQL> create table test100 as select * from test.test_redaction;
create table test100 as select * from test.test_redaction
*
ERROR 在行 1:
ORA-28081: 權限不足 - 命令參照隱匿的物件.
--刪除遮蔽policy
BEGIN
DBMS_REDACT.DROP_POLICY (
object_schema => 'TEST',
object_name => 'TEST_REDACTION',
policy_name => 'TEST_POLICY');
END;
/
SQL> create table test100 as select * from test.test_redaction;
已建立表格.
SQL>
在我們刪除policy後才能複製表格,很顯然的並不能用這種方式把資料複製出去。
沒有留言:
張貼留言