今天做实验的时候发现机器中的一个数据库执行drop tablespace会报下面的错误(很奇怪的错误,sys用户操作楞说权限不足):
SQL>drop tablespace test1;
drop tablespace test1
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01031: insufficient privileges
使用sql trace跟踪了一下,发现是在执行下面的SQL语句时出错了
The following statement encountered a error during parse:
select dummy from dual where ora_dict_obj_type = 'TABLE'
Error encountered: ORA-01031
突然想到前几天做实验的时候折腾dual表来着,查看一下现在dual表的情况:
sys@TEST>select * from dual;
D A
- ----------
X
估计找到原因了,上次做实验的时候给dual表添加了一列,看来drop操作看来是要用到dual表的。尝试删除A列,但由于dual表是属于sys用户的,不能删除
sys@TEST>alter table dual drop column a;
alter table dual drop column a
*
ERROR at line 1:
ORA-12988: cannot drop column from table owned by SYS
最后把dual表重建了,问题解决。看样在dual表在Oracle数据库中还是很重要的,一定不能对生产库的dual做除select外的其他操作。解决的步骤如下:
1.先创建了一个自定义的dual表暂时顶替
sys@TEST>create table my_dual as select dummy from dual;
Table created.
sys@TEST>select * from my_dual;
D
-
X
2.创建临时dual表的同义词,并赋给所有用户select的权限
sys@TEST>create public synonym dual for my_dual;
Synonym created.
sys@TEST>grant select on my_dual to public;
Grant succeeded.
3.删除原有dual表
sys@TEST>drop table sys.dual;
Table dropped.
4.重建dual表(第一个dual就新建的sys.dual表,第二个dual是my_dual的同义词)
sys@TEST>create table dual as select * from dual;
Table created.
5.删除在临时dual表上建立的同义词
sys@TEST>drop public synonym dual;
Synonym dropped.
sys@TEST>select * from dual;
D
-
X
6.创建dual表的同义词,并赋给所有用户select的权限
sys@TEST>create public synonym dual for sys.dual;
Synonym created.
sys@TEST>grant select on dual to public;
Grant succeeded.
7.重建dual表后,删除表空间没有问题了
sys@TEST>drop tablespace temp01 including contents and datafiles;
Tablespace dropped.