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)
ORACLE查询表最近更改的数据 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE的更多相关文章
- ORACLE查询表最近更改数据的方法
修改项目时,涉及到了Oracle中许多表的修改(包括:增加.删除字段,修改注释等).由于开始没有进行记录,造成在上测试机时,忘记了具体修改过哪些表了.后来在网上查找了一些资料,例如: 1.select ...
- Oracle 查询表中字段里数据是否有重复
1.查找单个字段 select 字段名,count(*) from table group by 字段名 having count(*) > 1 2.查找组合字段: SELECT TEST_NA ...
- Oracle查询表里的重复数据方法:
一.背景 一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录. 二.解决 select id from group by id having count ...
- oracle查询表数据并重新插入到本表
oracle查询表数据并重新插入到本表 CreateTime--2018年5月17日10:30:10 Author:Marydon 1.情景描述 --查询表中数据 SELECT * FROM at ...
- 四、Oracle loop循环、while循环、for循环、if选择和case选择、更改读取数据、游标、触发器、存储过程
数据库的设计(DataBase Design): 针对于用户特定的需求,然后我们创建出来一个最使用而且性能高的数据库! 数据库设计的步骤: 01.需求分析 02.概念结构设计 03.逻辑结构设计 04 ...
- 针对Oracle数据库表中的数据的常见操作
1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名 for update; 例:sele ...
- oracle 查询表名以及表的列名
oracle 查询表名以及表的列名的代码. 1.查询表名: 代码如下: select table_name,tablespace_name,temporary from user_tables [ ...
- oracle 查询表的大小,表空间的使用情况,默认表空间
oracle 查询表的大小,表空间的使用情况,默认表空间 oracle 查询表的大小,表空间的使用情况,默认表空间 --查看某张表占用磁盘空间大小 ( 表名大写 ) Select Segment_Na ...
- 类型:Oracle;问题:oracle 查询表详细信息;结果:oracle查询表信息(索引,外键,列等)
oracle查询表信息(索引,外键,列等) oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表sel ...
随机推荐
- python的字符串内建函数(方法)
原本总结一下,后来发现这个里面讲的很全,可以点进去参考:http://www.runoob.com/python/python-strings.html
- 【树】Unique Binary Search Trees
题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For e ...
- Fiddler Web Debugger安装后与浏览器之间的常用设置(辅助爬虫)(图文详解)
不多说,直接上干货! 怎么让我们的浏览经过代理服务呢?如下来正确设置: 这里有个经验,最好用历史低版本的火狐浏览器.比如 http://ftp.mozilla.org/pub/firefox/rele ...
- j2ee高级开发技术课程第二周(web请求的整个过程、XML)
博客非原创,只是收集整理了一下网上的一些文章 一.web请求的整个过程 1)把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括 ...
- 术语CDATA,其实可以理解为一种特殊的转移字符
参考:http://www.w3school.com.cn/xml/xml_cdata.asp 常见于XML文档,所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(Charact ...
- c#基础学习(0630)之面向对象总习
面向对象总习 1.封装.继承.多态 ****字段:存储数据,访问修饰符应该设置为private私有的 ****属性:保护字段,对字段的取值和赋值的限定 ****new关键字: 1.在堆中开辟空间(引用 ...
- C#中is与as的区别分析
这篇文章主要介绍了C#中is与as的区别,较为详细的分析了is与as的原理与特性及用法区别,具有很好的学习借鉴价值,需要的朋友可以参考下 本文实例分析了C#中is与as的区别,分享给大家供大家参考.具 ...
- [转] 如何应用设计模式设计你的足球引擎(三和四)----Design Football Game(Part III and IV)
原文地址:http://www.codeproject.com/KB/cpp/applyingpatterns2.aspx 作者:An 'OOP' Madhusudanan 译者:赖勇浩(http:/ ...
- 【转载&&干货】Noip应试技巧
NOIP应试技巧 如何看待别人的经验? 我想大家都有台上的学长滔滔不绝,但是自己在台下漠不关心,或是老师考试前的叮嘱说完一会儿功夫就忘记了的经历吧.所以,有可能我接下来的所说的话,一到考场上就全部忘记 ...
- 【转】SpringBoot系列之—瘦身部署
一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼: 编译出来的 Jar 包很大,如果工程引入了许多开源组件 ...