1、概述

本报只适用于Oracle Enterprise Edition,它用于实现精细访问控制,并且精细访问控制是通过在SQL语句中动态增加谓词(WHERE子句)来实现的.
通过使用ORACLE的精细访问控制特征,可以使不同数据库用户在执行相同SQL语句时操作同一张表上的不同数据.
例如多个用户执行select * from emp时,各自看到的行数不同。A只能看到财务部的记录,B只能看到市场部的数据。

2、包的组成

1)、add_policy
作用:用于为表、视图或同义词增加一个安全策略,当执行该操作结束是会自动提交事务。
语法dbms_rls.add_policy(
object_aschema in varchar2 null,
object_name in varchar2,
policy_name in varchr2,
function_schema in varchar2 null,
policy_function in varchar2,
statement_type in varchar2 null,
update_check in boolean false,
enable in boolean true,
static_policy in boolean false);
其中

  • object_aschema:指定包含表、视图或同义词的方案(默认null表示当前方案),
  • object_name:指定要增加安全策略的表、视图或同义词,
  • policy_name:指定要增加的安全策略名称,
  • function_schema:指定策略函数的所在方案(默认null表示当前方案),
  • policy_function:指定生成安全策略谓词的函数名,
  • statement_type:指定使用安全策略的sql语句(默认null表示适用于select、insert、update、delete),
  • update_check:指定执行insert、update时是否检查安全策略,
  • enable:指定是否要激活安全策略,
  • static_policy:指定是否要生成静态的安全策略。

2)、drop_policy
作用:用于删除定义在特定表、视图或同义词的安全策略,当试行该操作结束时会自动提交事务。
语法:dbms_rls.drop_policy(
object_achema in varchr2 null,
object_name in varchar2,
policy_name in varchar2);

3)、refresh_policy
作用:用于刷新与安全策略修改相关的所有sql语句,并使得Oracle重新解析相关sql语句,自动提交。
语法:dbms_rls.refresh_policy(
object_achema in varchr2 null,
object_name in varchar2 null,
policy_name in varchar2 null);

4)、enable_policy
说明:用于激活或禁止特定的安全策略,默认情况下当增加安全策略时会自动激活,自动提交。
语法:dbms_rls.enable_policy(
object_achema in varchr2 null,
object_name in varchar2,
policy_name in varchar2,
enable in boolean);

5)、create_policy_group
作用:用于建立安全策略组
语法:dbms_rls.create_policy_group(object_schema varchar2, object_name varchar2,policy_group varchar2);
其中policy_group指定策略组的名称。

6)、add_grouped_policy
作用:用于增加与特定策略组相关的安全策略。
语法:dbms_rls.add_grouped_policy(object_schema varchar2, object_name varchar2,policy_group varchar2,policy_name varchar2,
function_schema
varchar2,policy_function varchar2,statement_types varchar2,update_check
boolean,enabled boolean,static_policy boolean false);

7)、add_policy_context
作用:用于为应用增加上下文
语法:dbms_rls.add_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);
其中namespace指定命名空间,attribute指定上下文属性。

8)、delete_policy_group
作用:用于删除安全策略组
语法:dbms_rls.delete_policy_group(object_schema varchar2,object_name varchar2,policy_group varchar2);

9)、drop_grouped_policy
作用:用于删除特定策略组的安全策略。
语法:dbms_rls.drop_grouped_policy(object_schema varchar2,object_name varchar2,policy_group varchar2,policy_name varchar2);

10)、drop_policy_context
作用:用于删除对象的上下文。
语法:dbms_rls.drop_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);

11)、enable_grouped_policy
作用:用于激活或禁止特定策略组的安全策略
语法:dbms_rls.enable_grouped_policy(object_schema
varchar2,object_name varchar2,group_name varchar2,policy_name
varchar2,enable boolean);

12)、refresh_grouped_policy
作用:用于刷新与特定安全策略组的安全策略相关的sql语句(重新解析sql语句)
语法:dbms_rls.refresh_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2);

3、使用dbms_rls实现精细访问控制

假设希望sys、system、scott用户可以访问emp表的所有员工,blake用于智能访问部门30的员工,jones用户只能访问部门20的员工,其他用户只能访问部门10的员工。

步骤如下
1)、建立应用上下文
说明:要求用户必须具有create any context系统权限。
create or replace context empenv using scott.ctx;--建立名称为empenv的应用上下文,其属性有scott方案的包ctx包设置。

2)、建立包过程设置应用上下文属性
create or replace package scott.ctx as
procedure set_deptno;
end;
create or replace package body scott.ctx as
procedure set_deptno is
id number;
begin
if sys_context('userenv','session_user')='JONES' then
dbms_session.set_context('empenv','deptno',20);
elsif sys_context('userenv','session_user')='BLAKE' then
dbms_session.set_context('empenv','deptno',30);
else
dbms_session.set_context('empenv','deptno',10);
end if;
end;
end;

3)、建立登录触发器
说明:用户登录数据库之后会自动触发登陆触发器,建立登录触发器的目的是要隐含调用过程ctx.set_deptno,从而设置上下文属性。必须要以sys用户身份建立登陆触发器。
conn sys/oracle as sysdba
create or replace trigger login_trig
after logon on database call scott.ctx.set_deptno

4)、建立策略函数
策略函数必须带有2个参数,第一个参数对应于方案名,第二个参数对应于表名、视图名、同义词名。
create or replace package scott.emp_security as
function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
end;
create or replace package body scott.emp_security ad
function emp_sec(p1 varchar2,p2 varchar2) return varchar2
is
d_predicate varchar2(2000);
begin
if user not in ('SYS','SYSTEM','SCOTT') then
d_predicate:='deptno=SYS_CONTEXT(''empenv'',''deptno'')'
return d_predicate;
end if;
return '1=1';
end;
end;

5)、增加策略
说明:增加策略,并定义对象、策略、策略函数以及SQL语句之间的对应关系。
execute dbms_rls.add_policy('scott','emp','emp_policy','scott','emp_security.emp_sec','select');
执行add_policy后会在系统默认策略组sys_default中增加策略emp_policy,并在scott.emp上的select语句使用该策略。
其中第一个参数是对象所在方案名,第二个参数是对象名,第三个参数是策略名,第四个参数策略函数所在的方案名,
第五个参数时策略函数,第六个参数是使用该策略的sql语句(如果不指定则select,insert,ypdate,delete都会使用该策略)

当SYS,SYSTEM,SCOTT登录查询,谓词为1=1,当JONES登陆谓词为deptno=20,当blake登陆谓词为deptno=30。

八、dbms_rls(实现精细访问控制)的更多相关文章

  1. Oracle 常用系统包

    一.DBMS_OUTPUT(用于输入和输出信息) 二.DBMS_JOB(用于安排和管理作业队列) 三.dbms_pipe(类似UNIX系统的管道) 四.dbms_alert(用于生成并传递数据库预警信 ...

  2. 十八、oracle 角色

    一.介绍角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理.假定有用户a,b,c为了让他们都拥有如下权限1. 连接数据库2. 在scott.emp表上select,insert,up ...

  3. 权限<九>

     介绍 角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理,假定有用户 a,b,c 为了让他们都拥有权限 1. 连接数据库 2. 在 scott.emp 表上 select,ins ...

  4. oracle 笔记

    1.Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create databas ...

  5. oracle10 权限角色

    管理权限和角色 介绍 这一部分我们主要看看oracle中如何管理权限和角色,权限和角色的区别在那里.   当刚刚建立用户时,用户没有任何权限,也不能执行任何操作,oracle数据库会自动创建一个方案, ...

  6. 最全的ORACLE-SQL笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...

  7. oracle日记

    win7旗舰版安装oracle11g 64位用sql plus可以登录 但用pl/sql dev报错ORA-12560 小型数据库:access.foxbase 中型数据库:mysql.sqlserv ...

  8. oracle 角色

    一.介绍角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理.假定有用户a,b,c为了让他们都拥有如下权限1. 连接数据库2. 在scott.emp表上select,insert,up ...

  9. iOracle实战笔记(第五天)

    导读 今天的主要内容:维护数据的完整性.索引.管理Oracle的权限和角色. 一.维护数据库的数据的完整性 数据完整性用于确保数据库数据遵从一定的商业规则和逻辑规则.在Oracle中,数据完整性可以使 ...

随机推荐

  1. spoj1811 LCS - Longest Common Substring

    地址:http://www.spoj.com/problems/LCS/ 题面: LCS - Longest Common Substring no tags  A string is finite ...

  2. Java程序运行在Docker等容器环境有哪些新问题

    基本回答 一.  对于Java来说,Docker毕竟是一个较新的环境,其内存.CPU等资源限制是通过ControlGroup实现的.早期的JDK版本并不能识别这些限制,进而会导致一些基础问题. 1.如 ...

  3. ansible playbook部署ELK集群系统

    一.介绍 总共4台机器,分别为 192.168.1.99 192.168.1.100 192.168.1.210 192.168.1.211 服务所在机器为: redis:192.168.1.211 ...

  4. mysql外键约束无法删除数据的情况解决办法

    先删除子表的数据,然后再删除主表的数据.

  5. [2010-12-28 20:39]ActionScript3.0中用要的公式

    一.质点的运动(1)——直线运动 1)匀变速直线运动 1.平均速度V平=s/t(定义式) 2.有用推论Vt2-Vo2=2as 3.中间时刻速度Vt/2=V平=(Vt+Vo)/2 4.末速度Vt=Vo+ ...

  6. oracle中job定时器任务

    对于DBA来说,经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作.但是,Oracle定时器Job时间的处理上,千变万化,今天我把比较常用 ...

  7. c++ 中 BOOL与bool TRUE与true FALSE与false 区别

    转自:http://blog.chinaunix.net/uid-28458801-id-3941112.html   FALSE/TRUE与false/true的区别 1.FALSE/TRUE与fa ...

  8. T-shirt again

    T-shirt again 标签(空格分隔): 软工实践 第一次获得小黄裳是在大一下的C++课上,见T-shirt 0.0... 这次在软工课上能再次获得小黄裳,是我没有想到的,个人觉得里面有蛮多的运 ...

  9. 彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    以前写程序一直没有注意hashCode的作用,一般都是覆盖了equals,缺没有覆盖hashCode,现在发现这是埋下了很多潜在的Bug!今天就来说一说hashCode和equals的作用. 先来试想 ...

  10. 【读书笔记】《深入浅出nodejs》第三章 异步I/O

    1. 为什么要异步I/O (1)用户体验上: 并发的优势: M+N+... -> max(M,N,...)  --> 使后端能够快速的响应资源 *并发的劣势:... (2)资源分配: 单线 ...