技术开发 频道

Oracle 10g特性之虚拟专用数据库

    共享策略类型。

    为了重用代码并最大限度地利用已经分析过的代码,您可以决定为几个表使用通用的策略函数。例如,在上述示例中,我们可能对于不同类型的帐户拥有不同的表 — SAVINGS 和 CHECKING — 但是规则仍然是相同的:限制用户查看余额超过其授权范围的帐户。这种情况要求为 CHECKING 和 SAVINGS 表上的策略使用统一的函数。该策略创建为 context_sensitive。

    假设事件按如下顺序发生:

    1. 连接会话

    2. 设置应用程序上下文

    3. select * from savings;

    4. select * from checking;

    即使应用程序上下文在第 3 步与第 4 步之间没有改变,策略函数也会重新执行,因为现在所选择的表已经不同。这不是我们所希望的情况,因为策略函数相同,不需要重新执行该函数。

    10g 中的新功能是能够在对象间共享策略。在上述示例中,您可以将这些策略的策略类型定义为:

    policy_type => dbms_rls.shared_context_sensitive     

    将策略声明为 "shared" 可以在以上所示的情况中不再执行该函数,从而提高了性能。

    选择性的列

    现在设想一种情况,只有在选择了特定列时才会应用 VPD 策略。在上述示例的表 ACCOUNTS 中,各行如下所示:

    ACCTNO ACCT_NAME  BALANCE
    ------ ------------ -------
    1 BILL CAMP  1000
    2 TOM CONNOPHY 2000
    3 ISRAEL D   1500       

    不允许 Michelle 查看余额超过 1600 的帐户。当她执行类似以下的查询时:

select * from accounts;

    将看到:

    ACCTNO ACCT_NAME  BALANCE
    ------ ------------ -------
    1 BILL CAMP  1000
    3 ISRAEL D   1500      

    acctno 2 的余额超过 1600,它已禁止显示。对于 Michelle 而言,表中只有两行,而不是三行。当她执行类似以下的查询时:

select count(*) from accounts;

    该查询只计算表中的记录数,输出是二,而不是三.

0
相关文章