包含同名触发器的表PURGE TABLE出错

 今天在测试的时候无意中发现了一个10g的小bug。当包含同名触发器的表被放入回收站时,PURGE TABLE会报错。

  例子如下:

SQL> CREATE TABLE T (ID NUMBER);

  表已创建。

SQL> CREATE OR REPLACE TRIGGER T BEFORE INSERT ON T
FOR EACH ROW
BEGIN
NULL;
END;
/

  触发器已创建

SQL> DROP TABLE T;

  表已删除。

SQL> PURGE TABLE T;
PURGE TABLE T

  *第 1 行出现错误:

  ORA-38307: 对象不在回收站中

  查询回收站,可以发现T表:

SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE FROM RECYCLEBIN;
OBJECT_NAME ORIGINAL_NAME TYPE
------------------------------
BIN$+CjKdYw1T2+phKc0o+wpyg==$0 T TRIGGER
BIN$0Lhl98NsTUaWFEUUrsVdyg==$0 T TABLE

  闪回操作并不受影响,而且这种表如果直接删除并PURGE也不会出错。

SQL> FLASHBACK TABLE T TO BEFORE DROP;

  闪回完成。

SQL> DROP TABLE T PURGE;

  表已删除。

  问题出在同名的触发器上,如果没有触发器,或者触发器与表名不相同的话,则不存在问题:

SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> CREATE OR REPLACE TRIGGER TRI_T BEFORE INSERT ON T
FOR EACH ROW
BEGIN
NULL;
END;
/

  触发器已创建

SQL> DROP TABLE T;

  表已删除。

SQL> PURGE TABLE T;

  表已清除。

  错误的解决方法很多,除了上面的先闪回在直接删除外,还可以在PURGE TABLE的时候指定回收站中的名称,或者采用直接PURGE RECYCLEBIN的方式清除(这种方法会将当前用户下RECYCLEBIN中所有的对象清除)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值