WEB开发网
开发学院数据库Oracle Oracle虚拟专用数据控制方法应用 阅读

Oracle虚拟专用数据控制方法应用

 2008-12-24 13:06:54 来源:WEB开发网   
核心提示: 为保持向后兼容性,10g中的默认策略类型为“dynamic” — 正如Oracle9i中一样,Oracle虚拟专用数据控制方法应用(2),在这种情况下,对于每行以及每位用户,如果在会话期间没有发生会话上下文的变化,则不重新执行该函数,在每次访问表时都对策

为保持向后兼容性,10g中的默认策略类型为“dynamic” — 正如Oracle9i中一样。在这种情况下,对于每行以及每位用户,在每次访问表时都对策略函数进行重新求值。让我们来详细分析策略谓词:

where am_name = 'admin'

忽略掉where 子句,谓词就具有两个不同的部分:在等式操作符之前的部分(am_name)和等式操作符之后的部分 ('SCOTT')。在大多数情况下,后面的部分更象是变量,因为它是由用户的数据提供的(如果用户是 SCOTT,则其值为 'SCOTT')。在等号前面的部分是静态的。因此,即使函数不必为生成适当的谓词而对每行求出策略函数的值,由于了解前面部分的静态性以及后面部分的动态性,也可以提高性能。在10g中,可以在dbms_rls.add_policy调用中使用 "context_sensitive" 类型的策略作为参数来实现这种方法:

policy_type => dbms_rls.context_sensitive

在另一个示例中,我们有一个称为ACCOUNTS的表,它拥有几列,其中一列是BALANCE,表示帐户余额。假设允许某个用户查看低于某特定余额的帐户,而该余额由应用程序上下文所决定。我们并不在策略函数中将此余额值固定,而是3是根据应用程序上下文确定,如:

create or replace vpd_pol_func
(
p_schema in varchar2,
p_table in varchar2
)
return varchar2
is
begin
return 'balance < sys_context(''vpdctx'', ''maxbal'')';
end;

应用程序上下文VPDCTX的属性MAXBAL可以在会话的前期设定,而函数在运行时可以容易地获得该数值。

请仔细注意该示例。谓词有两部分:小于号之前的部分和之后的部分。之前的部分是“balance”一词,它是文字符。后面的部分从某种程度而言是静态的,因为应用程序上下文变量在改变之前一直是常量。如果应用程序上下文属性不变,则整个谓词是常量,因此不需要重新执行函数。如果策略类型定义为对上下文敏感,则Oracle数据库10g可以识别此情况以用于优化。如果在会话期间没有发生会话上下文的变化,则不重新执行该函数,从而显著提高了性能。

Tags:Oracle 虚拟 专用

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