-- 1、建立測試表
create table TEST_POLICY
(
USERNAME VARCHAR2(10),
PASSWORD NUMBER(10)
);
insert into TEST_POLICY values('a',30);
insert into TEST_POLICY values('b',20);
insert into TEST_POLICY values('c',40);
commit;
--2、建立政策限制函數,表隻可輸入密碼為40的使用者,其他使用者将被删除
CREATE OR REPLACE Function Fn_GetPolicy(P_Schema in varchar2,
P_Object in varchar2)
return varchar2 is
L_PREDICATE VARCHAR2(1000) := '';
Begin
L_PREDICATE := 'password=40';
Return L_PREDICATE;
end Fn_GetPolicy;
--3、建立政策
declare
begin
-- Call the procedure
sys.dbms_rls.add_policy(object_schema => :資料表(或視圖)所在的Schema名稱/使用者,
object_name => :資料表(或視圖)的名稱,
policy_name => :policy的名稱
function_schema => :傳回Where子句的函數所在Schema名稱/使用者,
policy_function => :傳回Where子句的函數名稱,
statement_types => :要使用該Policy的DML類型,如'Select,Insert,Update,Delete',
update_check => 僅适用于Statement_Type為'Insert,Update',值為'True'或'False',
enable => 是否啟用,值為'True'或'False',
static_policy => 預設值為FALSE。如果它被設定為TRUE則所有使用者啟用該政策,sys或特權使用者例外。
policy_type => :預設值是null,意味着static_policy的值決定,在這裡指定任何政策将覆寫static_policy的值。
long_predicate => long_predicate,
sec_relevant_cols => :敏感的字段名稱,
sec_relevant_cols_opt => :設定為dbms_rls.ALL_ROWS來顯示所有的行,敏感的列的值為null);
end;
--注:如果Update_Check設為'True',則使用者插入的值不符合Policy_Function傳回條件時,該DML執行傳回錯誤資訊。
--現在就可以工作了:
select * from TEST_POLICY ; 看看結果怎樣, 是不是少了password<>40的資料了.
--4、檢視目前使用者的政策
SELECT * FROM USER_POLICIES;
--5、删除政策
DECLARE
BEGIN
Dbms_Rls.drop_policy('SCOTT', --要删除的Policy所在的Schema
'TEST_Policy', --要删除Policy的資料表(或視圖)名稱
'T_TESTPOLICY' --要删除的Policy名稱
);
end;
####################模拟測試#########################