zoukankan      html  css  js  c++  java
  • ORACLE查询表最近更改的数据

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

    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)。

  • 相关阅读:
    现代软件工程 第一章 概论 第4题——邓琨
    现代软件工程 第一章 概论 第9题——邓琨
    现代软件工程 第一章 概论 第7题——张星星
    现代软件工程 第一章 概论 第5题——韩婧
    hdu 5821 Ball 贪心(多校)
    hdu 1074 Doing Homework 状压dp
    hdu 1074 Doing Homework 状压dp
    hdu 1069 Monkey and Banana LIS变形
    最长上升子序列的初步学习
    hdu 1024 Max Sum Plus Plus(m段最大子列和)
  • 原文地址:https://www.cnblogs.com/wzmenjoy/p/2367636.html
Copyright © 2011-2022 走看看