10.1.4 表的删除

当一个表不需要时,可以将其删除。删除表时,将产生以下结果:

·表的结构信息从数据字典中被删除,表中的数据不可访问。

·表上的所有索引和触发器被一起删除。

·所有建立在该表上的同义词、视图和存储程序变为无效。

·所有分配给表的区被标记为空闲,可被分配给其的对数据库对象。

一般情况下,普通用户只能删除自己的表。若希望删除其他用户的表,则必须具有DROP ANY TABLE系统权限。为了防止用户对表进行误删除,在数据库中提供了一个回收站。当表被删除时,表所占用的存储空间并不是立即被释放,而是被放进了回收站。

回收站实际上是一个数据字典表,用于记录被删除的表、索引等数据库对象的信息。当一个数据库对象被删除时,它所占用的存储空间并不立即释放,而是被重命名后放进了回收站。如果后来用户发现某个对象是被误删除的,可以从回收站中将其恢复。

当用户删除一个表空间时,表空间中的数据库对象并不被放入回收站,而且回收站中原来属于该表空间的数据库对象也将被清除。当一个用户被删除时,属于这个用户的数据库对象也不被放入回收站,而且回收站中原来属于该用户的数据库对象也将被清除。

用户可以在回收站中查看属于自己的、被删除的数据库对象,数据库管理员可以查看所有被删除的数据库对象。用户可以通过以下的语句查看回收站中的内容:


SQL>SELECT*FROM RECYCLEBIN;


数据库对象被删除后,它将被重命名并放入回收站。重命名的目的是为了防止被删除对象的名称相互冲突。重命名的规则为:


BIN$id$版本


其中id是由oracle产生的包含26个字符的字符串,是被删除数据库对象的唯一标识。版本是由数据库服务器自动指定的版本号。

为了查看回收站的方便,Oracle数据库提供了两个数据字典视图:

USER_RECYCLEBIN:包含当前用户的被删除的数据库对象,RECYCLEBIN是它的同义词。

DBA_RECYCLEBIN:包含所有被删除的数据库对象,仅数据库管理员可以访问。

例如,以下语句用于查询SCOTT用户被删除的数据库对象:


SQL>SELECT object_name, original_name FROM DBA_RECYCLEBIN

WHERE owner='SCOTT';


OBJECT_NAME ORIGINAL_NAME

BIN$yrMKlZaLMhfgNAgAIMenRA==$0 T2


用户也可以通过执行SQL*Plus命令show recyclebin来查看回收站。例如:


SQL>show recyclebin

ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME


T2 BIN$yrMKlZaVMhfgNAgAIMenRA==$0 TABLE 2010-03-30:09:51:05


尽管表已经被放入回收站,用户还是可以访问表中的数据,只是表名必须使用它在回收站中的名称。例如:


SQL>SELECT*FROM"BIN$yrMKlZaVMhfgNAgAIMenRA==$0";


当用户确信一个数据库对象不再需要时,可以执行PURGE命令将其从回收站中清除,该对象及其相关对象所占用的存储空间将一起被释放。清除数据库对象时,可以使用回收站中的名称,也可以使用被删除前的名称。例如,以下两条语句的作用都是从回收站中清除表T2:


SQL>PURGE TABLE BIN$yrMKlZaVMhfgNAgAIMenRA==$0;

SQL>PURGE TABLE T2;


如果希望在删除表的同时释放存储空间,可以在DROP TABLE命令中使用PURGE子句,这个表就直接被删除了,而不是被放到回收站中。例如:


SQL>DROP TABLE T1 PURGE;


用户还可以选择清除回收站中原来属于某个表空间的所有数据库对象,或者清除某个用户的原来属于某个表空间的所有数据库对象,还可以清除属于自己的数据库对象。这三种操作对应的命令格式分别为:


SQL>PURGE TABLESPACE USERS;

SQL>PURGE TABLESPACE USERS USER SCOTT;

SQL>PURGE RECYCLEBIN;


对于第三种用法,数据库管理员可用来清除回收站中的所有内容,只是要将RECYCLEBIN替换为DBA_RECYCLEBIN。

如果一个数据库对象被删除了,那么在被从回收站中清除之前,可以通过执行FLASHBACK命令将其恢复,并可通过RENAME子句为其指定一个新的名称。例如:


SQL>FLASHBACK TABLE T2 TO BEFORE DROP

RENAME TO TT2;


以上语句把表T2从回收站中恢复到被删除前的状态,并将其重命名为TT2。如果没有通过RENAME子句为它指定名称,它将使用原来的名称。