zoukankan      html  css  js  c++  java
  • ORACLE查询表最近更改的数据 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE

    转自 http://blog.chinaunix.net/uid-8504518-id-3325718.html

     

    今天开发人员问我如何快速并方便的查出一张表最近被更改的记录,这个需求很简单,由于是查最近被更改的数据,查回滚段就可以,下面是我做的小实验。

    SQL> create table test(id number,name varchar2(10),gender varchar2(5));

    表已创建。

    SQL> insert into test values(1,'宋春风','男');  已创建 1 行。

    SQL> insert into test values(2,'叶民','男');     已创建 1 行。

    SQL> insert into test values(3,'白冰','男');     已创建 1 行。

    SQL> insert into test values(4,'方巍森','男');  已创建 1 行。

    SQL> insert into test values(5,'孙书祯','男');  已创建 1 行。

    SQL> insert into test values(6,'史波','男');     已创建 1 行。

    SQL> commit;                                            提交完成。

    利用下面的SQL就可以查处最近更改的数据。

    SQL> SELECT ID,NAME,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION 

    FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE 

    VERSIONS_STARTTIME IS NOT NULL ORDER BY VERSIONS_STARTTIME DESC;

            ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V

    ---------- ------ ----- ------------------------- ------------------------- -

             6 史波   男    30-11月-11 04.02.28 下午                            I

             5 孙书祯 男    30-11月-11 04.02.28 下午                            I

             1 宋春风 男    30-11月-11 04.02.28 下午                            I

             3 白冰   男    30-11月-11 04.02.28 下午                            I

             2 叶民   男    30-11月-11 04.02.28 下午                            I

             4 方巍森 男    30-11月-11 04.02.28 下午                            I

    已选择6行。

    修改几条数据和接下来的查询做对比。

     

    SQL> UPDATE TEST SET GENDER='女' WHERE NAME='孙书祯';     已更新 1 行。

    SQL> COMMIT;      提交完成。

    SQL> UPDATE TEST SET GENDER='女' WHERE NAME='史波';        已更新 1 行。

    SQL> COMMIT;                                                                         提交完成。

    再次查询,被修改的数据就可以看到被修改和修改前的数据。

    SQL> SELECT ID,NAME,GENDER,VERSIONS_STARTTIME,VERSIONS_ENDTIME,

    VERSIONS_OPERATION FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND 

    MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL ORDER BY 

    VERSIONS_STARTTIME DESC;

            ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V

    ---------- ------ ----- ------------------------- ------------------------- -

             6 史波   女    30-11月-11 04.15.07 下午                            U

             5 孙书祯 女    30-11月-11 04.14.31 下午                            U

             4 方巍森 男    30-11月-11 04.02.28 下午                            I

             3 白冰   男    30-11月-11 04.02.28 下午                            I

             2 叶民   男    30-11月-11 04.02.28 下午                            I

             1 宋春风 男    30-11月-11 04.02.28 下午                            I

             6 史波   男    30-11月-11 04.02.28 下午  30-11月-11 04.15.07 下午  I

             5 孙书祯 男    30-11月-11 04.02.28 下午  30-11月-11 04.14.31 下午  I

    已选择8行。   

    再修改几条数据后后查询。

    SQL> delete from test WHERE NAME='史波';            已删除 1 行。

    SQL> delete from test WHERE NAME='孙书祯';         已删除 1 行。

    SQL> commit;                                                      提交完成。

    SQL> SELECT ID,NAME,GENDER,VERSIONS_STARTTIME,VERSIONS_ENDTIME,

    VERSIONS_OPERATION FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND 

    MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL ORDER BY 

    VERSIONS_STARTTIME DESC;

            ID NAME   GENDE VERSIONS_STARTTIME        VERSIONS_ENDTIME          V

    ---------- ------ ----- ------------------------- ------------------------- -

             5 孙书祯 男    30-11月-11 04.26.02 下午                            D

             6 史波   男    30-11月-11 04.26.02 下午                            D

             6 史波   女    30-11月-11 04.15.07 下午  30-11月-11 04.19.08 下午  U

             5 孙书祯 女    30-11月-11 04.14.31 下午  30-11月-11 04.19.08 下午  U

             2 叶民   男    30-11月-11 04.02.28 下午                            I

             3 白冰   男    30-11月-11 04.02.28 下午                            I

             4 方巍森 男    30-11月-11 04.02.28 下午                            I

             5 孙书祯 男    30-11月-11 04.02.28 下午  30-11月-11 04.14.31 下午  I

             1 宋春风 男    30-11月-11 04.02.28 下午                            I

             6 史波   男    30-11月-11 04.02.28 下午  30-11月-11 04.15.07 下午  I

    已选择10行。

    通过以上小实验可以看出,VERSIONS_STARTTIME是数据被修改的起始时间,VERSIONS_ENDTIME是数据被修改后新数据的有效时间,也就是VERSIONS_STARTTIME和VERSIONS_ENDTIME时间段内,这条数据再没被修改过,如果VERSIONS_ENDTIME为空,就说明这天记录从VERSIONS_STARTTIME时间起再没被修改过。VERSIONS_OPERATION是修改状态,I代表INSERT,U代表UPDATE,D代表DELETE。此时如果想回滚INSERT的数据,只需要DELETE反向操作即可,如果想回滚UPDATE操作,将数据反向UPDATE回去即可,比如本实验已经可以看到进行UPDATE操作的是NAME为史波和孙书祯的两条记录,而且也可以看到进行UPDATE之前的数据他们的性别是男,所以只需要在做个反向UPDATE,将性别该为男即可实现回退,如果要回滚DELETE操作,同样做个INSERT操作,将删除的数据在插回去即可。

    注:此SQL只能查询到回滚段内的信息,超出回滚段范围这个SQL就无能为力了,需要借助LOGMGR工具挖掘日志了(详见http://www.dbdream.org/?p=149)

     

     

  • 相关阅读:
    超大文件上传-如何上传文件-大文件上传
    局域网 前端大文件上传
    B/S 前端大文件上传
    PHP 前端大文件上传
    .NET 前端大文件上传
    C#.NET 前端大文件上传
    ASP.NET 前端大文件上传
    SpringBoot 前端大文件上传
    SpringMVC 前端大文件上传
    JAVA 前端大文件上传
  • 原文地址:https://www.cnblogs.com/princessd8251/p/3430580.html
Copyright © 2011-2022 走看看