你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
oracle 基础(41)
 

除了不需要在表上创建视图,不需要创建同义词指向该视图,不需要维护额外的授权之外,该方法是更加优秀的。 如果您需要拥有不同的策略把该值显示给不同的人,您可以很容易地修改策略函数(第 11 行)添加更多的检查。 例如,您的策略可以是:所有用户都可以看到敏感性不强的诊断代码(例如普通感冒)。 因此,您的策略函数和下面的类似,假设一般性感冒的 DIAGNOSIS_CODE 为“01”。

  1  create or replace function pd_pol
  2  (
  3     p_schema        in varchar2,
  4     p_obj           in varchar2
  5  )
6  return varchar2
  7  is
  8     l_ret   varchar2(2000);
9  begin
 10     if (p_schema = USER) then
 11             l_ret := NULL;
 12     else
 13             l_ret := 'diagnosis_code=''01''';
 14     end if;
 15     return l_ret;
16* end;

注意:仅当诊断代码为“01”而不是其它时,我们在第 13 行添加要显示的额外谓词。 现在进行测试。

SQL> conn arup/arup
Connected.
SQL> select * from arup.patient_diagnosis;

PATIENT_ID DIAGNOSIS_ID DI  DOCTOR_ID BILLING_CODE
---------- ------------ -- ---------- ------------
         1            1 01          1         1003
         1            2 02          1         1003
         1            3 11          1         1003
         2            1 11          1         1005
         2            2 41          2         1005

SQL> conn ananda/ananda
Connected.
SQL> select * from arup.patient_diagnosis;

PATIENT_ID DIAGNOSIS_ID DI  DOCTOR_ID BILLING_CODE
---------- ------------ -- ---------- ------------
         1            1 01          1         1003
         1            2 ?           1         1003
         1            3 ?           1         1003
         2            1 ?           1         1005
         2            2 ?           2         1005

注意:诊断代码“01”代表病人 id 1 和诊断 id 1,这是唯一允许的诊断代码;因此显示得很清晰。 其它的显示已经显示为孔,并且得到有效地屏蔽。

提示
如果您想屏蔽敏感列,程序也没有提及到它们,就没有提示。

如果您使用视图方法(这里敏感列只是从该视图中删除),则将会引发一个问题,这里程序使用像 SELECT * FROM TABLE ... 一样的结构。 因为已经没有明确对列进行命名,缺少一列将影响到程序执行。 但是,这不是一个关于修改视图方法(在这里列仍然存在但是为空)的问题。

有一个您应该意识到的很重要的提示。 假如您有一个称为“CONTRACT_AMOUNT”的列;如果数值小于某个特定值(比如 500),该列就显示。如果数值大于 500,该列就显示为空。 该表有三行,这三行所在列的数值分别为 300, 300, 600。 在列屏蔽之前,如果用户提交以下查询

select avg (contract_amount) from contracts;

他将得到 400 (就是 300,300 和 600 的平均值)。 在列屏蔽之后,数值为 $600 的列的值将变为空,因此用户将看到的值分别为 300,300 和空。 现在,输入同样的查询,将会显示 200 (300,300 和空)。 请注意一个重要的区别: 所显示的值为 200;而不是 400

请意识到列屏蔽可能引入的这种重要区别。

操作计划

  1. 在所有敏感的表上列出所有敏感的列。
  2. 确定将要屏蔽的敏感的列。
  3. 确定权限模式。
  4. 如果您使用的是 Oracle 数据库 10g 第 1 版或更高版本,请选择 VPD 方法。
    另外,
    选择基于视图的方法。
  5. 如果您选择 VPD 方法:
    1. 给各个表构建策略函数。
    2. 给各个表构建策略。 这将帮助您在特定的表上对屏蔽进行控制。
  6. 如果您选择基于视图的方法:
    1. 在各个表(表的名字通常为 VW_<table_name>)上创建视图,
    2. 创建指向该视图的同义词(同义词的名称和表的名称相同)。
    3. 在表上撤消给用户授予的权限。
    4. 再次给视图授予权限。
    5. 重新编译所有依赖的无效对象。

(编辑: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