你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
oracle 基础(24)
 
create context user_level_ctx using set_user_level_ctx;
以及相关的可信过程:
create or replace procedure set_user_level_ctx
(
    p_level in number
)
as
begin
    dbms_session.set_context (
            'USER_LEVEL_CTX',
            'LEVEL',
            p_level
    );
end;
接着,您需要创建登录触发器以设置适当的应用程序环境。
create or replace trigger tr_set_user_level
after logon
on database
declare
   l_level number;
begin
   select userlevel
   into l_level
   from arup.userlevels
   where username = user;
   set_user_level_ctx (l_level);
exception
   when NO_DATA_FOUND then
null;
   when OTHERS then
        raise;
end;
这设置了一个阶段,您可以按照该阶段在应用程序环境属性设置用户级别。 我们测试一下,以确保:
SQL> conn clerk1/clerk1
Connected.
SQL> select sys_context('USER_LEVEL_CTX','LEVEL') from dual;

SYS_CONTEXT('USER_LEVEL_CTX','LEVEL')
--------------------------------------
1

SQL> conn clerk2/clerk2
Connected.
SQL> select sys_context('USER_LEVEL_CTX','LEVEL') from dual;

SYS_CONTEXT('USER_LEVEL_CTX','LEVEL')
--------------------------------------
2

SQL> conn clerk3/clerk3
Connected.
SQL> select sys_context('USER_LEVEL_CTX','LEVEL') from dual;

SYS_CONTEXT('USER_LEVEL_CTX','LEVEL')
--------------------------------------
3

正如您可以看到的,每个用户 ID 都设置了相应的级别。 现在,您可以在表上构建 VPD。 您可以使用所提供的 PL/SQL 包 DBMS_RLS 控制整个 VPD 基础架构;一个称为策略的概念控制着决定应该显示哪些行的规则。 策略将“谓词”(WHERE 条件)应用到表中的所有查询上,有效地限制了对行的访问。 一个称为策略函数的函数生成 WHERE 条件。 因此,首先我们必须创建策略函数,该函数返回 WHERE 条件以将该条件应用到查询中。

create or replace function get_acc_max_bal
(
p_schema in varchar2,
   p_obj           in varchar2
)
return varchar2
as
   l_ret   varchar2(2000);
begin
select
           case userlevel
                   when 1 then 'acc_bal <= 1000'
                   when 2 then 'acc_bal <= 1200'
                   when 3 then null
else
                   '1=2'
end
   into l_ret
   from userlevels
where username = 'HR'
   return l_ret;
end;
然后添加策略:
begin
   dbms_rls.add_policy (
object_name => 'EMP',
policy_name => 'ACCOUNTS_ACCESS',
policy_function => 'USER_ONLY',
          statement_types      => 'INSERT, UPDATE, DELETE, SELECT',
          update_check         => TRUE
          );
end;
这次表得到保护。 当 CLERK1 登录并从表中进行选择:
SQL> select * from arup.accounts;

     ACCNO ACC_NAME                ACC_BAL
---------- -------------------- ----------
         1 John                       1000
Clerk1 只能看到 ACCNO 1,余额为 1,000。因为没有授予 Clerk1 查看高于 1,000 的账户余额,所以他看不到其它账户。 但是,当 Clerk2 登录时:
SQL> conn clerk2/clerk2
Connected.
SQL> select * from arup.accounts;

     ACCNO ACC_NAME                ACC_BAL
---------- -------------------- ----------
         1 John                       1000
         2 Joe                        1200

她也可以看到 ACCNO 2。 ACCNO 2 的余额为 1,200,在给 Clerk2 的授权限制之内。

您可以使用该技术将被限制的视图类放到表中。 在项目锁定中,这将是一个很方便的工具。

策略
关键是找出各方面的哪些信息将被保护,哪些列上的信息将被保护。 这听起来很简单,但是实际做起来是很难的。 收集该信息需要商业知识,或者合作者至少要更熟悉那些过程。 一旦您识别到表和列,您应该能够按照以上背景部分中示例中显示的那样实施 VPD 策略。

即使 VPD 是很效的,如果您想让一些用户可以不受限制就可以访问表怎么办? 角色 EXEMPT ACCESS POLICY 的确是这样做的。

grant exempt access policy to ananda;

从此处开始,ANANDA 将跳过在所有表中定义的所有访问策略。

使用户跳过所有访问限制可能是不可接受的,然而,一个更好的解决方案是在策略函数中对其进行编码。 一个很好的示例就是表的模式所有者——无疑您想该所有者看到表的所有行而不受到限制。 您可以在策略函数中对其进行如下编码:

create or replace function get_acc_max_bal
(
p_schema in varchar2,
   p_obj           in varchar2
)
return varchar2
as
   l_ret   varchar2(2000);
begin
   if (p_schema = USER) then
           l_ret := NULL;
else
select
                   case userlevel
                           when 1 then 'acc_bal <= 1000'
                           when 2 then 'acc_bal <= 1200'
                           when 3 then null
else
                           '1=2'
end
           into l_ret
           from userlevels
where username = 'HR'
end if;
   return l_ret;
end;

当表的所有者登录 (p_schema = USER) 时,该版本函数返回 NULL,所以对表的访问不受限制。 当然,您可以在该函数中进行任意更改,以允许更多用户跳过 VPD 策略。

(编辑:aniston)

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089