oracle 策略POLICY学习
2015-10-20 21:58
405 查看
-- 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;
####################模拟测试#########################
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;
####################模拟测试#########################
相关文章推荐
- mysql与oracle转换遇到小问题 关键字的处理
- mysql与oracle转换遇到的不同--case when
- oracle pl/sql之sql中的---if语句
- CentOS 6.3 32位静默安装Oracle 11g r2详细教程
- oracle 7
- oracle 8
- oracle 7
- oracle 6
- oracle 4
- oracle 3
- oracle 2
- 如何用Excel直接查询Oracle中的数据(转)
- oracle oracle中ORA-00923: 未找到要求的 FROM 关键字
- IE11 打开Oracle ERP报错的解决方法
- 定时每天执行前一天的数据导入oracle
- sqoop导入hdfs上的数据到oracle
- 本地搭建gitlab环境,配置邮件通知和基本操作
- ORACLE数据恢复方法(提交事务也可以)
- oracle pl/sql之sql中的复合变量之记录类型
- oracle第三周