WEB开发网
开发学院数据库Oracle Oracle 10g 新特性之虚拟专用数据库 阅读

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

 2006-08-07 11:52:45 来源:WEB开发网   
核心提示: 假设事件按如下顺序发生:1. 连接会话2. 设置应用程序上下文3. select * from savings;4. select * from checking;即使应用程序上下文在第 3 步与第 4 步之间没有改变,策略函数也会重新执行,Oracle 10g 新特性之虚拟专用数据库(5

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

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;

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

但是,此时我们可以决定将安全策略稍微放松一些。在本查询中,Michelle 不能查看帐户余额等秘密数据;她只是计算表中所有记录的数目。在与安全策略一致的情况下,我们可以允许此查询计算所有记录的数目,无论是否允许她查看这些记录。如果需要这样,则在对 10g 的 dbms_rls.add_policy 的调用中的另一个参数允许实现此功能:

sec_relevant_cols => 'BALANCE'

现在,当用户选择列 BALANCE 时,无论是显式选择还是隐含在 select * 中,VPD 策略都会介入,对行作出限制。否则将会选择表中所有的行,因为在查询中用户只选择了总计行数,而没有选择列 BALANCE。如果将以上参数设置为所示的形式,则查询

select count(*) from accounts;

将显示三列,而不是两列。但是查询:

select * from accounts;

上一页  1 2 3 4 5 

Tags:Oracle 特性 虚拟

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接