码迷,mamicode.com
首页 > 数据库 > 详细

Oracle策略相关

时间:2015-10-28 12:25:10      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

Oracle策略可以限制查询、修改、删除、新增等操作,刚接触,对查询做一个测试:

参照 http://blog.csdn.net/diyyong/article/details/19552637

用法如下:

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;

创建函数:

create or replace function f_policy
(
  p_owner  in varchar2,--两个参数必须要有,名字可以不一样
  p_object in varchar2
) return varchar2 as
  v_sql varchar2(2000);
begin
  v_sql := lower(sys_context(‘USERENV‘, ‘CURRENT_SQL‘, 4000));
  if instr(v_sql, ‘ where ‘) = 0 then
    return ‘deptno=10‘;
    --raise_application_error(-20001, ‘未包含where条件‘);
  end if;
  return ‘‘;
end;

  

添加策略(需在sys下添加):

begin
dbms_rls.add_policy(object_schema => ‘scott‘, object_name => ‘emp‘,
policy_name => ‘sal‘, function_schema => ‘scott‘,
policy_function => ‘f_policy‘, sec_relevant_cols => ‘sal‘);
end;

该策略和函数搭配,限制了如果关于emp表的dml语句中未包含where下自动添加where dept=10的条件,示例如下:

select * from emp;

技术分享

 删除策略:

begin  
  sys.dbms_rls.drop_policy(object_schema => ‘scott‘,  
                           object_name => ‘emp‘,  
                           policy_name => ‘sal‘);  
end;

  

Oracle策略相关

标签:

原文地址:http://www.cnblogs.com/mellowsmile/p/4916858.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!