深入学习和研究Oracle,希望结交更多志同道合的朋友。

【原创】drop操作与dual还是有很大关系的(ORA-01031错误的解决)

上一篇 / 下一篇  2008-05-02 19:51:01 / 个人分类:Oracle

今天做实验的时候发现机器中的一个数据库执行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.


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar