oracle 闪回查询 权限,Oracle 闪回查询教程

author: zy

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

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工具挖掘日志了

补充资料:

查系统表和指定scn的用法

select * from v$transaction as of scn

2388210;

select

dbms_flashback.get_system_change_number,t.CURRENT_SCN from v$database t;

select * from v$transaction as of

timestamp  (systimestamp - interval '1' minute)  --查询系统表要选connection as

sysDba,不然报"权限不足"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值