默认表空间被更改的小测试

六月 25, 2009 – 9:49 上午

当一个用户默认的表空间被删除,那么会发生什么事情呢?
下面测试一下:

SQL> create tablespace tbs_sunwg01 datafile ‘D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS_SUNWG01.DBF’ SIZE 10m;

Tablespace created

SQL> create user sunwg01 identified by test default tablespace tbs_sunwg01;

User created

SQL> select NAME,DATATS# from sys.user$ where name=’SUNWG01′;

NAME DATATS#
—————————— ———-
SUNWG01 15

SQL> select TS#,NAME from sys.ts$ where name=’TBS_SUNWG01′;

TS# NAME
———- ——————————
15 TBS_SUNWG01

从数据字典里面也可以查出来,用户SUNWG01的默认表空间编号为15。
编号为15的表空间为TBS_SUNWG01。

用户和表空间的关系是通过TS#来关联的,那么我把表空间先删除,然后在重建同名表空间,该用户的默认表空间应该也是存在问题的。

测试如下:

SQL> drop tablespace TBS_SUNWG01 including contents and datafiles;

Tablespace dropped

SQL> create table sunwg01.test as select * from dba_users;

create table sunwg01.test as select * from dba_users

ORA-00959: 表空间 ‘TBS_SUNWG01′ 不存在

此时创建表的时候出错误,那么重建同名表空间。

SQL> create tablespace tbs_sunwg01 datafile ‘D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS_SUNWG01.DBF’ SIZE 10m;

Tablespace created

SQL> create table sunwg01.test as select * from dba_users;

create table sunwg01.test as select * from dba_users

ORA-01950: 对表空间 ‘TBS_SUNWG01′ 无权限

在我们的意料之外,这个时候并没有报空间不存在,而是说没有权限。

SQL> alter user sunwg01 quota unlimited on tbs_sunwg01;

User altered

SQL> create table sunwg01.test as select * from dba_users;

Table created

修改用户sunwg01在表空间tbs_sunwg01的限额之后,可以正常创建表。
为什么呢?

SQL> select TS#,NAME from sys.ts$ where name=’TBS_SUNWG01′;

TS# NAME
———- ——————————
15 TBS_SUNWG01

秘密就在这,这个时候新建的表空间还是使用了原来的TS#编号,所以这个时候没有问题。

那么我们继续测试,如果这个时候表空间没办法重新使用原来的编号会发生什么?

SQL> create tablespace tbs_sunwg02 datafile ‘D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS_SUNWG02.DBF’ SIZE 10m;

Tablespace created

SQL> drop tablespace TBS_SUNWG01 including contents and datafiles;

Tablespace dropped

SQL> select NAME,DATATS# from sys.user$ where name=’SUNWG01′;

NAME DATATS#
—————————— ———-
SUNWG01 15

SQL> create table sunwg01.test1 as select * from dba_users;

create table sunwg01.test1 as select * from dba_users

ORA-00959: 表空间 ‘TBS_SUNWG01′ 不存在

这个时候肯定是会报错的,那么我更改表空间TBS_SUNWG02为TBS_SUNWG01试试。

SQL> alter tablespace tbs_sunwg02 rename to tbs_sunwg01;

Tablespace altered

SQL> select NAME,DATATS# from sys.user$ where name=’SUNWG01′;

NAME DATATS#
—————————— ———-
SUNWG01 15

SQL> select username,default_tablespace from dba_users where username=’SUNWG01′;

USERNAME DEFAULT_TABLESPACE
—————————— ——————————
SUNWG01 _$deleted$15$0

这个时候在user$表中用户sunwg01的默认表空间还是标号为15的表空间,不过在dba_users里面默认的表空间则表示为_$deleted$15$0。
说明该用户原来的默认表空间为编号为15,并且已经被干掉了。

SQL> create table sunwg01.test as select * from dba_users;

create table sunwg01.test as select * from dba_users

ORA-00959: 表空间 ‘_$deleted$15$0′ 不存在

这个时候会报表空间不存在。
此时我们只需要修改该用户的默认表空间为新的tbs_sunwg01即可。

SQL> alter user sunwg01 default tablespace tbs_sunwg01;

User altered

SQL> select NAME,DATATS# from sys.user$ where name=’SUNWG01′;

NAME DATATS#
—————————— ———-
SUNWG01 16

这样用户的默认表空间就被更新为新的tbs_sunwg01了。

Post a Comment