我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

10g中purge和flashback语句的重名问题

上一篇 / 下一篇  2006-01-26 00:00:00 / 个人分类:ORACLE

Oracle在10g可以在DROP表之后通过简单的命令将表恢复到删除以前的状态。这个命令就是FLASHBACK TABLE。这个功能和WINDOWS的回收站功能很想,而对应的清除回收站的功能就是PURGE。


:x0@#SL4\6V&{0

前两天偶然发现,虽然用户内的表名不能重复,但是由于回收站中给删除表重新起了名字,因此回收站可以包括多个同名表的删除结果。而清空回收站所使用的命令PURGE TABLE TABLENAME,其中TABLENAME是原来的表名,那么当出现重名时,将会清除或还原哪张表。

SQL> CREATE TABLE T (ID NUMBER);

表已创建。

SQL> DROP TABLE T;

表已删除。

SQL> CREATE TABLE T (NAME VARCHAR2(30));

表已创建。

SQL> DROP TABLE T;

表已删除。

SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, DROPTIME FROM RECYCLEBIN;

OBJECT_NAME ORIGINAL_NAME DROPTIMEITPUB个人空间8Z5s*@Em#A bT
------------------------------ -------------------- -------------------
!Y.\.Yp~0BIN$oakJIVdfR6OXXFWXRrLiow==$0 T 2006-01-26:23:30:39
/v G|?#s4E0BIN$t5ZwnqUHR5GTFh/0B5V/4A==$0 T 2006-01-26:23:30:40

SQL> FLASHBACK TABLE T TO BEFORE DROP;

闪回完成。

SQL> DESC T
sH.K/S\-MxP0 名称 是否为空? 类型
r'_$][dN5[cf8~d0 -------------------------------------- -------- -------------
r8aX#G2Rc_8}+g0 NAME VARCHAR2(30)

SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, CREATETIME, DROPTIME FROM RECYCLEBIN;

OBJECT_NAME ORIGINAL_NAME DROPTIME
1U0GLM|p(Q` H0------------------------------ -------------------- -------------------
{Wl$ch$nv0BIN$oakJIVdfR6OXXFWXRrLiow==$0 T 2006-01-26:23:30:39

SQL> DROP TABLE T;

表已删除。

SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, CREATETIME, DROPTIME FROM RECYCLEBIN;

OBJECT_NAME ORIGINAL_NAME DROPTIMEITPUB个人空间W6k`3O-I%h$\v
------------------------------ -------------------- -------------------
LJ h F#@0BIN$oakJIVdfR6OXXFWXRrLiow==$0 T 2006-01-26:23:30:39
5Wq H q XE"Uh5g0BIN$Ak85vOeaR6ucCt5Ek49Z/g==$0 T 2006-01-26:23:31:33

SQL> PURGE TABLE T;

表已清除。

SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, CREATETIME, DROPTIME FROM RECYCLEBIN;

OBJECT_NAME ORIGINAL_NAME DROPTIMEITPUB个人空间$Lb"x2ZB5m o z wl8P
------------------------------ -------------------- -------------------ITPUB个人空间LrKU*YF;D&Ig
BIN$Ak85vOeaR6ucCt5Ek49Z/g==$0 T 2006-01-26:23:31:33

也就是说FLASHBACK语句会还原最后放入回收站的表,而PURGE语句会清除最早进入回收站的表。

那么能不能根据自己的需要,指定清除或还原某张表呢,既然在回收站中的名字不同,则尝试在清除或还原时使用这个名字。注意到,回收站中的名字包含小写,则在引用的时候需要加上双引号。

SQL> FLASHBACK TABLE "BIN$Ak85vOeaR6ucCt5Ek49Z/g==$0" TO BEFORE DROP;

闪回完成。

看来这种方法果然可以,当回收站中存在同名对象的时候,可以用回收站中的名字进行清除和还原。另外FLASHBACK还有RENAME TO语句,可以在还原的时候对表进行重命名,避免和当前用户下已经存在的表冲突。

SQL> DROP TABLE T;

表已删除。

SQL> CREATE TABLE T (ID NUMBER);

表已创建。

SQL> FLASHBACK TABLE T TO BEFORE DROP RENAME TO OLD_T;

闪回完成。

SQL> SELECT * FROM TAB;

TNAME TABTYPE CLUSTERID
2iE!z,T#W,BC[0------------------------------ ------- ----------ITPUB个人空间t.H3R(m$jI-U
TEST1 TABLE
V#e|,q&^Xq8n;h0TEST TABLE
b2s!@1@7q]#|0TEST_LOB TABLE
o f*q$bYjk/~o'c'Y0OLD_T TABLEITPUB个人空间0^QG~ZL:|F4w
T TABLE


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar