Oracle基础包之DBMS_RLS(八)

概述

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

包的组成
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:指定是否要生成静态的安全策略。
drop_policy
作用:

用于删除定义在特定表、视图或同义词的安全策略,当试行该操作结束时会自动提交事务。

语法:
dbms_rls.drop_policy(
object_achema in varchr2 null,
object_name in varchar2,
policy_name in varchar2);
refresh_policy
作用:

用于刷新与安全策略修改相关的所有sql语句,并使得Oracle重新解析相关sql语句,自动提交。

语法:
dbms_rls.refresh_policy(
object_achema in varchr2 null,
object_name in varchar2 null,
policy_name in varchar2 null);
enable_policy
说明:

用于激活或禁止特定的安全策略,默认情况下当增加安全策略时会自动激活,自动提交。

语法:
dbms_rls.enable_policy(
object_achema in varchr2 null,
object_name in varchar2,
policy_name in varchar2,
enable in boolean);
create_policy_group
作用:

用于建立安全策略组

语法:
dbms_rls.create_policy_group(object_schema varchar2, object_name varchar2,policy_group varchar2);

--其中policy_group指定策略组的名称。
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);
add_policy_context
作用:

用于为应用增加上下文

语法:
dbms_rls.add_policy_context(object_schema varchar2,
				object_name varchar2,
				namespace varchar2,
				attribute varchar2);

--其中namespace指定命名空间,attribute指定上下文属性。
delete_policy_group
作用:

用于删除安全策略组

语法:
dbms_rls.delete_policy_group(object_schema varchar2,
						object_name varchar2,
						policy_group varchar2);
drop_grouped_policy
作用:
用于删除特定策略组的安全策略。
语法:
dbms_rls.drop_grouped_policy(object_schema varchar2,object_name varchar2,policy_group varchar2,policy_name varchar2);
drop_policy_context
作用:
用于删除对象的上下文。
语法:
dbms_rls.drop_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);
enable_grouped_policy
作用:

用于激活或禁止特定策略组的安全策略

语法:
dbms_rls.enable_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2,enable boolean);
refresh_grouped_policy
作用:

用于刷新与特定安全策略组的安全策略相关的sql语句(重新解析sql语句)

语法:
dbms_rls.refresh_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2);
使用dbms_rls实现精细访问控制

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

步骤如下

建立应用上下文
说明:

要求用户必须具有create any context系统权限。

create or replace context empenv using scott.ctx;
--建立名称为empenv的应用上下文,其属性有scott方案的包ctx包设置。
建立包过程设置应用上下文属性
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;
建立登录触发器
说明:

用户登录数据库之后会自动触发登陆触发器,建立登录触发器的目的是要隐含调用过程ctx.set_deptno,从而设置上下文属性。必须要以sys用户身份建立登陆触发器。

conn sys/oracle as sysdba
create or replace trigger login_trig
after logon on database call scott.ctx.set_deptno
建立策略函数

策略函数必须带有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;
增加策略
说明:

增加策略,并定义对象、策略、策略函数以及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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜未央,流年殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值