oracle策略POLICY学习

-- 1、创建测试表
 
create table TEST_POLICY
 
(
 
   USERNAME VARCHAR2(10),
 
   PASSWORD NUMBER(10)
 
);
 
insert into t_policy values ( 'a' ,30);
 
insert into t_policy values ( 'b' ,20);
 
insert into t_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
 
   Dbms_Rls.Add_Policy(Object_Schema   => 'SCOTT' , --数据表(或视图)所在的Schema名称
 
                       Object_Name     => 'TEST_Policy' , --数据表(或视图)的名称
 
                       Policy_Name     => 'T_TestPolicy' , --POLICY的名称,主要用于将来对Policy的管理
 
                       Function_Schema => 'SCOTT' , --返回Where子句的函数所在Schema名称
 
                       Policy_Function => 'Fn_GetPolicy' , --返回Where子句的函数名称
 
                       Statement_Types => 'Select,Insert,Update,Delete' , --要使用该Policy的DML类型,如'Select,Insert,Update,Delete'
 
                       Update_Check    => True , --仅适用于Statement_Type为'Insert,Update',值为'True'或'False'
 
                       Enable          => True --是否启用,值为'True'或'False'
 
                       );
 
end ;
 
--注:如果Update_Check设为'True',则用户插入的值不符合Policy_Function返回条件时,该DML执行返回错误信息。
 
--现在就可以工作了: select * from t_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 ;

猜你喜欢

转载自201404282204.iteye.com/blog/2261161
今日推荐