oracle策略POLICY学习

2014-11-24 15:53:20 · 作者: · 浏览: 0
oracle策略POLICY学习
01
-- 1、创建测试表
02
create table TEST_POLICY
03
(
04
  USERNAME VARCHAR2(10),
05
  PASSWORD NUMBER(10)
06
);
07
insert into t_policy values('a',30);
08
insert into t_policy values('b',20);
09
insert into t_policy values('c',40);
10
commit;
11
--2、创建策略约束函数,表只可输入密码为40的用户,其他用户将被删除
12
CREATE OR REPLACE Function Fn_GetPolicy(P_Schema in varchar2,
13
                                        P_Object in varchar2)
14
  return varchar2 is
15
  L_PREDICATE VARCHAR2(1000) := '';
16
Begin
17
  L_PREDICATE := 'password=40';
18
  Return L_PREDICATE;
19
end Fn_GetPolicy;
20
--3、创建策略
21
declare
22
Begin
23
  Dbms_Rls.Add_Policy(Object_Schema   => 'SCOTT', --数据表(或视图)所在的Schema名称 
24
                      Object_Name     => 'TEST_Policy', --数据表(或视图)的名称 
25
                      Policy_Name     => 'T_TestPolicy', --POLICY的名称,主要用于将来对Policy的管理 
26
                      Function_Schema => 'SCOTT', --返回Where子句的函数所在Schema名称 
27
                      Policy_Function =>
'Fn_GetPolicy', --返回Where子句的函数名称 28 Statement_Types => 'Select,Insert,Update,Delete', --要使用该Policy的DML类型,如'Select,Insert,Update,Delete' 29 Update_Check => True, --仅适用于Statement_Type为'Insert,Update',值为'True'或'False' 30 Enable => True --是否启用,值为'True'或'False' 31 ); 32 end; 33 --注:如果Update_Check设为'True',则用户插入的值不符合Policy_Function返回条件时,该DML执行返回错误信息。 34 --现在就可以工作了: select * from t_policy; 看看结果怎样, 是不是少了password<>40的数据了. 35 --4、查看当前用户的策略 36 SELECT * FROM USER_POLICIES; 37 --5、删除策略 38 DECLARE 39 BEGIN 40 Dbms_Rls.drop_policy('SCOTT', --要删除的Policy所在的Schema 41 'TEST_Policy', --要删除Policy的数据表(或视图)名称 42 'T_TESTPOLICY' --要删除的Policy名称 43 ); 44 end;