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#AbT
------------------------------ -------------------- -------------------
!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
------------------------------ -------------------- -------------------
LJhF#@0BIN$oakJIVdfR6OXXFWXRrLiow==$0 T 2006-01-26:23:30:39
5WqHq 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个人空间$L b"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: