今天在測試的時候無意中發現了一個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中所有的對象清除)。