首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 10g 回收站 Bug:同名觸發器導致 PURGE TABLE 失敗 (ORA-38307)

     編輯:Oracle 資料庫基礎

問題重現

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;
ORA-38307: 對象不在回收站中

但查詢 RECYCLEBIN 明顯存在:

OBJECT_NAME                    ORIGINAL_NAME  TYPE
------------------------------ -------------- ------
BIN$+CjKdYw1T2+phKc0o+wpyg==$0 T              TRIGGER
BIN$0Lhl98NsTUaWFEUUrsVdyg==$0 T              TABLE

根因

表與觸發器同名 (T) 進入回收站後,PURGE TABLE T 無法區分要清除哪個物件,導致語法解析失敗。此為 Oracle 10g 已知 Bug。

驗證:不同名觸發器不受影響

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;
表已清除。

三種繞過方案

  1. 先閃回再強制刪除(推薦,保留資料):
    FLASHBACK TABLE T TO BEFORE DROP;
    DROP TABLE T PURGE;
  2. 指定回收站系統名稱清除:
    PURGE TABLE "BIN$0Lhl98NsTUaWFEUUrsVdyg==$0";
  3. 清空整個回收站(慎用,會清除當前用戶所有廢棄物件):
    PURGE RECYCLEBIN;

最佳實務

  • 命名規範:觸發器建議加前綴 TRG_ 或後綴 _TRG,避免與表同名。
  • 生產環境謹慎使用 PURGE RECYCLEBIN,優先採用方案 1 或 2。
  • 升級至 11gR2+ 可修復此 Bug。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved