dbms_rls

包dbms_rls只适用oracle enterprise edition,他实现精细的访问控制;
  并且精细的访问控制是通过sql语句中动态增加谓词(where 子句)实现的;

可以使不同的数据库用户执行相同的sql语句,操作同一张表上的不同数据;

– 1,add_policy
/*
该过程用于给表,视图,或同义词增加一个安全策略;
当执行该操作结束后,会自动提交事务;
*/
dbms_rls.add_policy(object_schema => ,object_name => ,policy_name => ,
function_schema => ,policy_function => ,statement_types =>,
update_check => ,enable => ,static_policy =>
);

– 2,drop_policy
/*
该过程用于给表,视图,或同义词删除安全策略;
当执行该操作结束后,会自动提交事务;
*/
dbms_rls.drop_policy(object_schema => ,object_name => ,policy_name => );

– 3,refrsh_policy
/*
该过程用于刷新与安全策略修改相关的所有sql语句,并是oracle重新解析相关sql语句
当执行该操作结束后,会自动提交事务;
*/

dbms_rls.refresh_policy(object_schema => ,object_name => ,policy_name => );

– 4,enable_policy
/*
该过程用于激活或禁止特定的安全策略
当执行该操作结束后,会自动提交事务;
*/

dbms_rls.enable_policy(object_schema => ,object_name => ,policy_name => ,enable => );

– 5,create_policy_group
/*
该过程用于建立安全策略组
*/
dbms_rls.create_policy_group(
object_schema =>,object_name => ,policy_group =>
);

– 6,add_grouped_policy
/*
该过程用于增加与特定策略组相关的安全策略;
*/

dbms_rls.add_grouped_policy(
   object_schema => ,object_name => ,
   policy_group => ,policy_name => 
);

– 7,add_policy_context
/*
该过程用于为应用安全策略增加上下文;
*/
dbms_rls.add_policy_context(
object_schema =>,
object_name => ,
namespace => ,
attribute =>
);

– 8,delete_policy_group
/*
该过程用于删除安全策略分组
*/
dbms_rls.delete_policy_group(
object_schema => ,
object_name => ,
policy_group =>
);

– 9,drop_grouped_policy
/*
该过程删除特定策略组的安全策略
*/
dbms_rls.drop_grouped_policy(
object_schema => ,
object_name => ,
policy_group => ,
policy_name =>
);

– 10,drop_policy_context
/*
该过程删除上下文
*/
dbms_rls.drop_policy_context(
object_schema => ,
object_name => ,
namespace => ,
attribute =>
);

– 11,enable_grouped_policy
/*
该过程激活或禁止特定策略组的安全策略;
*/

  dbms_rls.enable_grouped_policy(
        object_schema => ,
        object_name => ,
        group_name => ,
        policy_name => ,
        enable =>
   );

– 12,refrsh_grouped_policy
/*
该过程刷新特定策略组的安全策略的相关sql语句,并重新解析sql语句;
*/

 dbms_rls.refresh_grouped_policy(
   object_schema => ,
   object_name => ,
   group_name => ,
   policy_name => 
);

/*
使用dbms_rls实现精细访问控制;
不同用户只能访问不同部门的员工;
*/

–1,建立应用上下文
create or replace context cz_emp using scott.ctx;

–2,建立包过程设置的应用上下文
create or replace package scott.ctx
as
procedure set_depno;
end;

create or replace package body scott.ctx as
   procedure set_depno 
   is
     no number(6);
   begin
     if sys_context('cz_emp','session_user')='test' then
       dbms_session.set_context('cz_emp','deptno',10);
     else if sys_context('cz_emp','session_user')='system' then
       dbms_session.set_context('cz_emp','deptno',20);
     else
       dbms_session.set_context('cz_emp','deptno',30); 
     end if;   
  end;  
end scott.ctx;

--3,建立登陆触发器
create or replace trigger tri_login
  after logon on database
  call scott.ctx.set_depno

–4,建立策略函数
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 as
function emp_sec(p1 varchar2,p2 varchar2 ) return varchar2
is
v_date varchar2(2000);
begin
if user not in (‘SYS’,’SCOTT’) then
v_date := ’ depno = sys_context(”cz_emp”,”deptno”)’;
return v_date;
end if;
return ‘1=1’;
end;
end ;

–5,增加策略
begin
dbms_rls.add_policy(‘SCOTT’,’EMP’,’emp_policy’,’SCOTT’,’scott.emp_security.emp_sec’,’select’);
end;

select deptno,ename from scott.emp [where ….];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的案例来说明DBMS_RLS如何实现行级安全性: 假设我们有一个表"TBL_SALARY",其中包含每个员工的薪资信息。我们想要确保只有HR部门的员工可以查看所有员工的薪资信息,而其他部门的员工只能查看自己的薪资信息。 1. 创建安全策略函数 我们可以创建一个安全策略函数"fn_security_policy",该函数将基于当前用户和部门来确定是否允许访问该行数据。以下是一个示例函数: ``` CREATE OR REPLACE FUNCTION fn_security_policy (p_schema VARCHAR2, p_table VARCHAR2) RETURN VARCHAR2 AS v_policy VARCHAR2(100) := '1=1'; BEGIN IF USER = 'HR' THEN v_policy := '1=1'; -- HR部门 ELSE v_policy := 'dept = USERENV(''CLIENT_INFO'')'; -- 根据部门进行访问控制 END IF; RETURN v_policy; END; ``` 该函数将返回一个SQL语句,该语句将用于限制对表的访问。在这个例子中,如果当前用户是HR部门,则返回"1=1",表示允许访问所有行;否则返回"dept = USERENV('CLIENT_INFO')",表示只允许访问与用户所在部门相同的行。 2. 创建安全策略 我们可以使用DBMS_RLS.CREATE_POLICY函数来创建安全策略。以下是一个示例: ``` BEGIN DBMS_RLS.CREATE_POLICY( object_schema => 'HR', object_name => 'TBL_SALARY', policy_name => 'salary_policy', function_schema => 'HR', policy_function => 'fn_security_policy', statement_types => 'SELECT'); END; ``` 该函数将创建一个名为"salary_policy"的安全策略,将其应用于HR模式下的"TBL_SALARY"表,并将其绑定到"fn_security_policy"函数。 3. 启用安全策略 我们可以使用DBMS_RLS.ENABLE_POLICY函数来启用安全策略: ``` BEGIN DBMS_RLS.ENABLE_POLICY( object_schema => 'HR', object_name => 'TBL_SALARY', policy_name => 'salary_policy'); END; ``` 该函数将启用名为"salary_policy"的安全策略,使其生效。 现在,如果HR部门的员工执行SELECT语句,则可以访问所有行。其他部门的员工只能访问与自己所在部门相同的行。 总之,DBMS_RLS提供了一种灵活的方式来实现数据库中的行级访问控制,可以根据具体的业务需求进行定制化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值