默认表空间被更改的小测试
六月 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了。