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

VPD 的最大挑战是对子表进行限制。 您的限制条件可能在称为 ACC_BAL 的列上;但是所有其它子表不可能有该列。 因此,您如何限制那些表?

例如,这里有一个称为地址的表,该表包含这些客户的地址。 该表没有称为 ACC_BAL 的列,因此您如何对该表设置和 ACCOUNTS 表一样的限制? 有如下两种方式:

  • 将列 ACC_BAL 添加到地址表中。 您可以通过主表 ACCOUNTS 中的触发器对该列进行更新。 现在,您可以使用 ACCOUNTS 上使用的相同策略函数定义表中的策略。

  • 对 ADDRESSES 表使用不同的策略函数。 在该函数中,返回值应该是
    ACCNO in (SELECT ACCNO FROM ACCOUNTS)

    这是策略限制中使用的谓词。 因此,VPD 将只显示表上的账户地址。而且因为无论如何 VPD 限制了表 ACCOUNTS,所以 VPD 将自动限制表 ADDRESSES。

您必须按照自己所处的环境从这两种方法中选取一种。

提示
几个潜在破环性提示如下:

  • VPD 运行的方式是重写查询以添加额外的谓词。 用户查询可能写得很好,可能调整得很好,但是引入额外的谓词却带来了破坏,因为优化计划可能改变。 您应该仔细考虑潜在的影响,通过建立索引降低风险。
  • 物化视图工作的方式是从底层表中选择行。 如果视图的模式所有者不受限制就可以访问该表,则只有那些和 VPD 策略一致的行才会被刷新,使视图不精确。
  • 如果您已经设置了复制,从事传播和接收工作的用户应该可以不受限制地对表进行访问。否则,他们只能复制表中的一部分。
  • 如果您使用直接路径插入(使用 APPEND 提示插入)对该表进行加载,那么您在该表上不可能有 VPD 策略。 使用可以不受限制地对表访问的用户,您应该临时禁止该策略,或进行插入。
  • 直接路径导出跳过 SQL 层;因此,VPD 策略不会被应用。 所以,当您使用 DIRECT=Y 选项导出表时,Oracle 忽略该表,并且使用常规路径导出该表。 这可能增加整个执行时间。

操作计划

这个计划是很复杂的,也是可改变的:

  1. 识别 VPD 将保护的表。
  2. 识别需要保护的表的列。
  3. 识别限制条件,例如,Salaries > 1000。
  4. 识别如何建立权限——例如,用户具备授权级别或角色吗? 您可能希望将用户分为三组,每组都有相关的授权级别。 或者,可能您想根据角色对用户群的访问限制进行分配——经理可以访问所有的行,职员可以访问超过 SALARY > 2000 行,等等。
  5. 决定您如何通过包变量、应用程序环境,或者静态表将权限传给策略函数。
  6. 如果需要创建更多的索引,请进行识别。
  7. 创建额外的索引。
  8. 识别子表,决定一个方案来启动通过新列或 IN 条件对子表的限制。
  9. 根据以上决定重新识别对索引的需求。
  10. 创建索引。
  11. 构建策略函数。
  12. 创建策略(但是禁止)。
  13. 在某个轻松活动的一天里,启动该策略和测试,使用常规用户账户访问该表以确保该策略的运行。 如果该策略不运行,请检查跟踪文件以找到错误。
  14. 如果该策略不运行,请启动该策略。
  15. 监控性能。
  16. 识别更多需求以构建索引,使用大纲,等等。
  17. 迭代所有表。

4.3 屏蔽敏感的列

背景
把您自己想象成为一名业余数据库黑客。 这里的数据库包含医疗记录,您正在寻找的信息是诊断代码。 您将寻找哪些列? 可能是称为诊断、疾病或者类似的列。

正如您可以看到的,带有明显名字的敏感列是至关重要的安全问题。

策略
如果对手以前不了解您数据库的内容,并且这些列的名字不直观,他们将不会去解读列的含义。 这个策略称为“无名安全”。 即使故意闯进数据库的经验丰富的黑客在做其它事情之前仍将需要追捕到列的名称。 因为他们的时间可能有限——几乎一直都是这样——他们通常会转到下一个机会上。 当然,使用无名列也加大了开发的难度。

进行折衷还有其它的办法,然而: 通过列屏蔽,您可以隐藏列的内容,只有合法用户才可以看到列的内容。

列屏蔽的方法有两种: 使用视图和使用 VPD。

使用视图。 这种方法适用于 Oracle 任何版本,但是如果您的数据库版本是 Oracle9i 或者更早,就只能选择这种方法。

假设您的表和以下类似:

SQL> desc patient_diagnosis
Name                              Null?类型
 ------------------- ------ -------------
 PATIENT_ID                 NUMBER
 DIAGNOSIS_ID               NUMBER
 DIAGNOSIS_CODE             VARCHAR2(2)
 DOCTOR_ID                  NUMBER(2)
 BILLING_CODE               NUMBER(10)
行类和以下类似:
SQL> select * from 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
在这里,您想屏蔽列 DIAGNOSIS_CODE 的值。
create view vw_patient_disgnosis
as
select
   patient_id,
   diagnosis_id,
   doctor_id,
   billing_code
from patient_diagnosis
/

然后,您可以给视图 VW_PATIENT_DIAGNOSIS 创建同义词 PATIENT_DIAGNOSIS,授予视图(而不是表)选择。 该视图屏蔽列 DIAGNOSIS_CODE。

这是一个相当简单的解决方案,因此您不要将所有用户的列屏蔽掉,您可能想创建基于角色的匿名——如果用户是一名经理,请显示被保护的列;否则的话不要显示。其方法是:传递应用程序环境或者全球变量以指定用户的角色。 如果应用程序环境属性是 IS_MANAGER,您可以使用:

create or replace view vw_patient_disgnosis
as
select
   patient_id,
   diagnosis_id,
   decode(
      sys_context('USER_ROLE_CTX','IS_MANAGER'), 
      'Y', DIAGNOSIS_CODE, null
   ) diagnosis_code,
   doctor_id,
   billing_code
from patient_diagnosis;
(编辑: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