<%@ page contentType="text/html; charset=gb2312"%> oracledatabase10g:闪回版本查询
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
oracledatabase10g:闪回版本查询
     发布者: 发布时间:2006-05-07

不需要设置,立即识别对行的所有更改

在 oracle9i database 中,我们看到它推出了以闪回查询形式表示的“时间机器”。该特性允许 dba 看到特定时间的列值,只要在还原段中提供该数据块此前镜像的拷贝即可。但是,闪回查询只提供某时刻数据的固定快照,而不是在两个时间点之间被更改数据的运行状态表示。某些应用程序,如涉及到外币管理的应用程序,可能需要了解一段时期内数值数据的变化,而不仅仅是两个时间点的数值。由于闪回版本查询特性,oracle database 10g 能够更方便高效地执行该任务。

查询对表的更改


在本示例中,我使用了一个银行外币管理应用程序。其数据库含有一个名称为 rates 的表,用于记录特定时间的汇率。
sql> desc rates
name              null?type
 ----------------- -------- ------------
currency                   varchar2(4)
rate                       number(15,10)

该表显示 us$ 与各种其他货币的汇率,在 currency 列中显示。在金融服务行业中,汇率不但在变更时进行更新,而且被记录在历史中。需要这种方式的原因是银行交易可能在“过去时间”生效,以便适应由于汇款而耗费的时间。例如,对于一项在上午 10:12 发生但在上午 9:12 生效的交易,其有效汇率是上午 9:12 的汇率,而不是现在的汇率。

直到现在,唯一的选择是创建一个汇率历史表来存储汇率的变更,然后查询该表是否提供历史记录。另一种选择是在 rates 表本身中记录特定汇率适用性的开始和结束时间。当发生变更时,现有行中的 end_time 列被更新为 sysdate,并插入一个具有新汇率的新行,其 end_time 为 null。

但是在 oracle database 10g 中,闪回版本查询特性不需要维护历史表或存储开始和结束时间。使用该特性,您不必进行额外的设置,即可获得某行在过去特定时间的值。

例如,假定该 dba 在正常业务过程中数次更新汇率 — 甚至删除了某行并重新插入该行:
insert into rates values (''euro'',1.1012);
commit;
update rates set rate = 1.1014;
commit;
update rates set rate = 1.1013;
commit;
delete rates;
commit;
insert into rates values (''euro'',1.1016);
commit;
update rates set rate = 1.1011;
commit;

在进行了这一系列操作后,dba 将通过以下命令获得 rate 列的当前提交值
sql> select * from rates;

curr       rate
---- ----------
euro     1.1011

此输出显示 rate 的当前值,没有显示从第一次创建该行以来发生的所有变更。这时使用闪回查询,您可以找出给定时间点的值;但我们对构建变更的审计线索更感兴趣 — 有些类似于通过便携式摄像机来记录变更,而不只是在特定点拍摄一系列快照。

以下查询显示了对表所做的更改:
select versions_starttime, versions_endtime, versions_xid,
versions_operation, rate
from rates versions between timestamp minvalue and maxvalue
order by versions_starttime
/

versions_starttime     versions_endtime       versions_xid     v       rate
---------------------- ---------------------- ---------------- - ----------
01-dec-03 03.57.12 pm  01-dec-03 03.57.30 pm  0002002800000c61 i     1.1012
01-dec-03 03.57.30 pm  01-dec-03 03.57.39 pm  000a000a00000029 u     1.1014
01-dec-03 03.57.39 pm  01-dec-03 03.57.55 pm  000a000b00000029 u     1.1013
01-dec-03 03.57.55 pm                         000a000c00000029 d     1.1013
01-dec-03 03.58.07 pm  01-dec-03 03.58.17 pm  000a000d00000029 i     1.1016
01-dec-03 03.58.17 pm                         000a000e00000029 u     1.1011

注意,此处显示了对该行所作的所有更改,甚至包括该行被删除和重新插入的情况。version_operation 列显示对该行执行了什么操作 (insert/update/delete)。所做的这些工作不需要历史表或额外的列。

在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 rownum、level 等其他熟悉的伪列相类似。其他伪列 — 如 versions_startscn 和 versions_endscn — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 flashback_transaction_query 中找到,其中列 xid 显示事务 id。例如,使用上述的 versions_xid 值 000a000d00000029,undo_sql 值显示了实际的语句。
select undo_sql
from flashback_transaction_query
where xid = ''000a000d00000029'';

undo_sql
----------------------------------------------------------------------------
insert into "ananda"."rates"("currency","rate") values (''euro'',''1.1013'');

除了实际语句之外,该视图还显示提交操作的时间标记和 scn、查询开始时的 scn 和时间标记以及其他信息。

找出一段时期中的变更

现在,让我们来看如何有效地使用这些信息。假设我们需要找出下午 3:57:54 时 rate 列的值。我们可以执行:
select rate, versions_starttime, versions_endtime
from rates versions
between timestamp
to_date(''12/1/2003 15:57:54'',''mm/dd/yyyy hh24:mi:ss'')
and to_date(''12/1/2003 16:57:55'',''mm/dd/yyyy hh24:mi:ss'')
/

rate versions_starttime     versions_endtime
---------- ---------------------- ----------------------
    1.1011

此查询与闪回查询类似。在以上的示例中,开始和结束时间为空,表示汇率在该时间段中没有更改,而是包含一个时间段。还可以使用 scn 来找出过去的版本值。可以从伪列 versions_startscn 和 versions_endscn 中获得 scn 号。以下是一个示例:
select rate, versions_starttime, versions_endtime
from rates versions
between scn 1000 and 1001
/

使用关键词 minvalue 和 maxvalue,可以显示还原段中提供的所有变更。您甚至可以提供一个特定的日期或 scn 值作为范围的一个端点,而另一个端点是文字 maxvalue 或 minvalue。例如,以下查询提供那些只从下午 3:57:52 开始的变更,而不是全部范围的变更:
select versions_starttime, versions_endtime, versions_xid,
versions_operation, rate
from rates versions between timestamp
to_date(''12/11/2003 15:57:52'', ''mm/dd/yyyy hh24:mi:ss'')
and maxvalue
order by versions_starttime
/

versions_starttime     versions_endtime       versions_xid     v       rate
---------------------- ---------------------- ---------------- - ----------
01-dec-03 03.57.55 pm                         000a000c00000029 d     1.1013
01-dec-03 03.58.07 pm  01-dec-03 03.58.17 pm  000a000d00000029 i     1.1016
01-dec-03 03.58.17 pm                         000a000e00000029 u     1.1011

最终的分析

闪回版本查询随取随用地复制表变更的短期易变数值审计。这一优点使得 dba 能够获得过去时间段中的所有变更而不是特定值,只要还原段中提供数据,就可以尽情使用。因此,最大的可用版本依赖于 undo_retention 参数。
有关闪回版本查询的更多信息,请参见 oracle database concepts 10g release 1 (10.1) 指南的相关部分。

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
oracle数据库性能优化技术
分析oracle数据库日志文件(1)
分析oracle数据库日志文件(2)
在.net中使用oracle数据库事务
oracle中的临时表用法汇总
pl/sql工具连接oralce数据库的方法
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(2195)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(8917)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(4019)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(2602)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(2617)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(9862)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号