删除表空间的操作
来源:互联网 发布:批八字算命软件 编辑:程序博客网 时间:2024/05/21 06:54
一个用户要删除数据库的表空间,首先该用户要具备drop tablespace的权限
在当前用户下执行以下语句来查询确认
select a2.username,a1.privilege from dba_sys_privs a1 , user_role_privs a2
where a1.privilege = 'DROP TABLESPACE'
and a1.grantee =a2.granted_role
SQL> conn wulw/123@ibm
已连接。
SQL> select a2.username,a1.privilege from dba_sys_privs a1 , user_role_privs a2
2 where a1.privilege = 'DROP TABLESPACE'
3 and a1.grantee =a2.granted_role;
USERNAME PRIVILEGE
------------------------------ ----------------------------------------
WULW DROP TABLESPACE
如果没有 drop tablespace,请先用更高级的用户(如sys)给予授权
SQL> conn sys/oracle@ibm as sysdba;
已连接。
SQL> grant drop tablespace to wulw ;
授权成功。
以上前提条件确认完,下面开始实验.
确认已有的表空间
SQL> select a.TS# ,a.NAME , b.NAME from v$tablespace a,v$datafile b
2 where a.TS# = b.TS#;
TS# NAME NAME
0 SYSTEM L:/ORACLE/ORADATA/IBM/SYSTEM01.DBF
1 UNDOTBS1 L:/ORACLE/ORADATA/IBM/UNDOTBS01.DBF
3 CWMLITE L:/ORACLE/ORADATA/IBM/CWMLITE01.DBF
4 DRSYS L:/ORACLE/ORADATA/IBM/DRSYS01.DBF
5 EXAMPLE L:/ORACLE/ORADATA/IBM/EXAMPLE01.DBF
6 INDX L:/ORACLE/ORADATA/IBM/INDX01.DBF
7 ODM L:/ORACLE/ORADATA/IBM/ODM01.DBF
8 TOOLS L:/ORACLE/ORADATA/IBM/TOOLS01.DBF
9 USERS L:/ORACLE/ORADATA/IBM/USERS01.DBF
10 XDB L:/ORACLE/ORADATA/IBM/XDB01.DBF
12 TDATA_01 L:/ORACLE/ORADATA/IBM/TDATA_01.ORA
14 TINDEX_01 L:/ORACLE/ORADATA/IBM/TINDEX_01.ORA
已选择12行。(为看起来直观,上面的显示作了手工格式化)
创建新的测试表空间:
SQL> create tablespace mytbs01
2 logging
3 datafile 'L:/ORACLE/ORADATA/IBM/mytbs01.dbf' size 10m REUSE ;
表空间已创建。
SQL> CREATE TABLESPACE "MYTBS02"
2 LOGGING
3 DATAFILE 'L:/ORACLE/ORADATA/IBM/MYTBS02.dbf' SIZE 10M REUSE ;
表空间已创建。
如果表空间里面没有任何数据对象,可以直接删除.
SQL> drop tablespace mytbs01;
表空间已丢弃。
这种删除方式相关的数据文件仍然存在于磁盘上.
(可以进入数据文件所在目录L:/ORACLE/ORADATA/IBM 进行查看 MYTBS01.DBF )
如果表空间里面含有数据对象,那么该表空间就不能像上面那样做直接删除了.
SQL> create tablespace mytbs01
2 logging
3 datafile 'L:/ORACLE/ORADATA/IBM/mytbs01.dbf' size 10m REUSE;
表空间已创建。
SQL> create table test(mobile number(13))
2 tablespace mytbs01;
表已创建。
SQL> drop tablespace mytbs01;
drop tablespace mytbs01
*
ERROR 位于第 1 行:
ORA-01549: 表空间非空,请使用 INCLUDING CONTENTS 选项
看到了吧,提示ora-01549错误.
如果要删除该表空间,可加上including contents子句.
如: drop tablespace mytbs01 including contents ;
如果想在删除表空间的同时也删除掉对应的数据文件,那就在上面的语句最后加上 and datafiles
成为 drop tablespace mytbs01
including contents and datafiles;
SQL> drop tablespace mytbs01
2 including contents and datafiles;
表空间已丢弃。
要注意的一点是,如果drop tablespace语句中含有datafiles,那datafiles之前必须有contents关键字,不然会提示ora-01911错误:
SQL> drop tablespace mytbs02
2 including datafiles;
including datafiles
*
ERROR 位于第 2 行:
ORA-01911: 需要 CONTENTS 关键字
接下来的实验是:
如果表空间A中有一个表ta,表空间B中有一个表tb,而ta与tb有着某种关系,那么是否可以按上面的方法直接干掉表空间A和表空间B呢?
看试验过程:
SQL> create tablespace mytbs01
2 logging
3 datafile 'L:/ORACLE/ORADATA/IBM/mytbs01.dbf' size 10m REUSE;
表空间已创建。
SQL> CREATE TABLESPACE "MYTBS02"
2 LOGGING
3 DATAFILE 'L:/ORACLE/ORADATA/IBM/MYTBS02.dbf' SIZE 10M REUSE ;
CREATE TABLESPACE "MYTBS02"
*
ERROR 位于第 1 行:
ORA-01543: 表空间 'MYTBS02' 已经存在
SQL> create table test(mobile number(13))
2 tablespace mytbs01;
表已创建。
SQL> create table test2(mobile number(13))
2 tablespace mytbs02;
表已创建。
SQL> alter table TEST2
2 add primary key (mobile);
表已更改。
SQL> ALTER TABLE test
2 ADD CONSTRAINT FOREIGN con_mobile REFERENCES test2(mobile);
表已更改。
以上的意思是:在表空间mytbs01上创建表test,在表空间mytbs02上创建表test2,两个表test和test2以外键相关联,test2为主表,test为从表.
现在尝试能否用上面的语句直接干掉mytbs02:
SQL> drop tablespace mytbs02;
drop tablespace mytbs02
*
ERROR 位于第 1 行:
ORA-01549: 表空间非空,请使用 INCLUDING CONTENTS 选项
SQL> drop tablespace mytbs02
2 including contents;
drop tablespace mytbs02
*
ERROR 位于第 1 行:
ORA-02449: 表中的唯一/主键被外部关键字引用
SQL> drop tablespace mytbs02
2 including contents and datafiles;
drop tablespace mytbs02
*
ERROR 位于第 1 行:
ORA-02449: 表中的唯一/主键被外部关键字引用
可见主表所在表空间因为表与其他空间上的表有联系,所以没办法直接删掉.
那mytbs01表空间能不能干掉?请看:
SQL> drop tablespace mytbs01
2 including contents and datafiles;
表空间已丢弃。
SQL> drop tablespace mytbs02
2 including contents and datafiles ;
表空间已丢弃。
嘿嘿,从表test所在的表空间mytbs01能直接干掉,而且从表的表空间干掉后,主表test2所在的表空间mytbs02也能干掉了!
那么,如果我只想干掉主表所在的表空间,又不想干掉从表所在的表空间那怎么办?
很简单,最笨的一招就是想把两个表的关联关系给灭了,(在上面的两个表中,就是把那个外键给删了)再把主表表所在的表空间删了.但这种方法可不太现实,如果一个表空间里有成百上千个对象与别的表空间里的对象有联系,总不能一个一个去"解铃"吧? 即使你本人就是"系铃"人,估计你也要"解"到郁闷死!
一个更简单的方法当然是级联删除了!
drop tablespace mytbs02
including contents and datafiles cascade constraints
试验如下:
SQL> create tablespace mytbs01
2 logging
3 datafile 'L:/ORACLE/ORADATA/IBM/mytbs01.dbf' size 10m REUSE;
表空间已创建。
SQL> CREATE TABLESPACE "MYTBS02"
2 LOGGING
3 DATAFILE 'L:/ORACLE/ORADATA/IBM/MYTBS02.dbf' SIZE 10M REUSE ;
表空间已创建。
SQL> create table test(mobile number(13))
2 tablespace mytbs01;
表已创建。
SQL> create table test2(mobile number(13))
2 tablespace mytbs02;
表已创建。
SQL> alter table TEST2
2 add primary key (mobile);
表已更改。
SQL> ALTER TABLE test
2 ADD CONSTRAINT FOREIGN con_mobile REFERENCES test2(mobile);
表已更改。
SQL> drop tablespace mytbs02
2 including contents and datafiles cascade constraints;
表空间已丢弃。
OK!正常搞定!
补充一句:以上试验环境为 windows2000+oracle9iR2
- 删除表空间的操作
- 删除表空间操作
- 关于Oracle表空间数据文件的修改删除操作
- 关于Oracle表空间数据文件的修改删除操作
- Oracle 删除用户和表空间的常用操作
- Oracle:SQL语句--对表空间的操作——删除表空间
- oracle删除用户和表空间操作
- oracle表空间用户添加、删除操作
- 表空间的操作
- 删除数据库的表空间
- 删除表空间的办法
- Oracle表空间的删除
- 表空间、临时表空间的操作
- shell脚本操作oracle删除表空间、创建表空间、删除用户
- oracle表空间操作(创建、修改、删除)
- Oracle 数据库操作 导入导出 删除用户 表空间
- oracle创建删除用户命令和部分表空间操作
- oracle 创建用户,密码 ,授权,表空间操作,删除等
- 研发人员如何看待项目开发管理
- WSS页面定制系列(2)---定制单个列表的表单页面
- Queue-C++
- 自定义Gridview的表头
- Queue-C++template1
- 删除表空间的操作
- SharePoint如何模拟用户
- SQL常用语句和函数(转)
- 软件测试
- 读帮助文档发现Delphi2009的新特性,象C语言一样用数组方式使用指针.
- mkswap的挽救方法
- 软件开发过程反思——从需求分析到最后开发出来的软件
- 收藏一个sqlfront的SN
- 在这个地方好好呆着,用文字记录我的成长...