1有問題。刪除用戶。
報告以下錯誤後退出
ORA-00604:遞歸SQL級別1出現錯誤
ORA-00942:表或視圖不存在。
我們有必要對遞歸SQL錯誤做壹個簡單的解釋。
我們知道當我們發出壹個簡單的命令時,
Oracle數據庫要在後臺解析這個命令,轉換成Oracle數據庫的壹系列後臺操作。
這些後臺操作統稱為遞歸sql。
例如,壹個簡單的DDL命令(如create table ),後臺有Oracle數據庫,實際上應該轉換為對底層表(如obj$、tab$和col$)的插入操作。甲骨文所做的工作可能比我們有時想象的要復雜得多。
2.追蹤問題
我們知道Oracle提供了sql_trace的功能。
可用於跟蹤Oracle數據庫的後臺遞歸操作。
通過跟蹤文件,我們可以找到問題。
以下是格式化後的輸出(tkprof):
以下語句在解析過程中遇到錯誤:
從SDO _ GEOM _元數據_表中刪除,其中SDO _所有者= 'WAPCOMM '
遇到錯誤:ORA-00942
Oracle首先顯示錯誤消息,我們看到ORA-00942錯誤是由於
SDO _ GEOM _元數據_表表/視圖不存在,因此可以定位問題。
對於這種錯誤,以後解決問題的方法要看問題的具體原因。
3.問題位置
對於這種情況,可以通過Metalink獲得以下解釋:
問題描述
Oracle Spatial選件已安裝,但您遇到了
嘗試刪除沒有空間表的用戶時出現以下錯誤,
作為系統連接:
第1行出錯:
ORA-00604:遞歸SQL級別1出現錯誤
ORA-00942:表或視圖不存在
ORA-06512:在第7行
942錯誤跟蹤將失敗的SQL語句顯示為:
從SDO _ GEOM _元數據_表中刪除,其中SDO _所有者= ' '
解決方案描述
(1)
在指向的系統下創建SDO _ GEOM _元數據_表的同義詞
MDSYS。GEOM元數據表。
對於本例,創建MDSYS的同義詞相對簡單。GEOM元數據表。
(2)
現在,用戶可以作為系統斷開連接。
相關文件
刪除用戶CASCA期間報告了ORA-604和ORA-942
4.實際治療
MDSYS。SDO _ GEOM _元數據_表是壹個空間對象,如果不使用空間選項,可以將其刪除。
SQL & gt連接/作為sysdbaConnected。
SQL & gtselect * from DBA _ SDO _ geom _ metadata order by owner;
select * from DBA _ SDO _ geom _ metadata按所有者排序
*
第1行出錯:
ORA-00942:表或視圖不存在
ORA-04063:查看" MDSYS。DBA _ SDO _ GEOM _元數據”有錯誤
SQL & gtselect object _ name from DBA _ objects where object _ name like“% SDO %”;
對象名稱
所有_ SDO _ GEOM _元數據
所有_ SDO _索引_信息
所有_ SDO _索引_元數據
DBA _ SDO _ GEOM _元數據
數據庫管理員索引信息
DBA _ SDO _ INDEX _元數據
....
DBA _ SDO _ GEOM _元數據
數據庫管理員索引信息
...
SDO _在_距離內
用戶_ SDO _ GEOM _元數據
用戶數據索引信息
用戶_ SDO _索引_元數據
選擇了88行。
SQL & gt刪除用戶MDSYS級聯;
用戶已刪除。
SQL & gtselect owner,type _ name from DBA _ types where type _ name like ' SDO % '。
未選擇任何行
SQL & gt
SQL & gtalter session set sql _ trace = true
會話已更改。
SQL & gt刪除用戶wapcomm
用戶已刪除。
SQL & gtalter session set SQL _ trace = false;
會話已更改。
SQL & gt出口
與Oracle8i企業版8.1 . 7 . 4 . 0-64位產品斷開連接
使用分區選項
JServer版本8.1 . 7 . 4 . 0-64位生產
這時候用戶就可以順利下降了。
5.壹點總結
使用sql_trace可以跟蹤數據庫的很多後臺操作,有助於我們發現問題。很多時候我們想研究Oracle的內部活動或者後臺操作,也可以通過sql_trace進行追蹤。sql_trace/10046是Oracle提供的最有效的診斷工具之壹。
案例4:表更新期間出現遞歸SQL2第2級失敗錯誤。
問題描述:表更新失敗,生成了ORA-00604錯誤消息。此錯誤發生在遞歸SQL級別2。
解決方案:不幸的是,這個錯誤沒有告訴您在錯誤發生時Oracle數據庫正在做什麽。當您執行SQL語句時,Oracle數據庫會在後臺為您做很多事情。例如,考慮以下SQL語句:
更新emp集合sal = sal*1.05其中empno = 1001;
這個SQL語句給編號為1001的員工加薪5%。當您執行該語句時,Oracle查詢數據目錄以確定該表是否存在或者您是否使用了同義詞。壹旦找到數據庫對象,Oracle將查詢數據字典以確定您是否有權訪問該對象。那麽,Oracle是如何與數據字典交互的呢?它執行自己的SQL語句。Oracle為您執行的這些SQL語句稱為遞歸SQL語句。您的初始SQL語句是0級。Oracle為妳執行的遞歸SQL語句是1級。有時候,壹個遞歸SQL語句會引起自己的遞歸SQL語句,這是2級。
在您的例子中,有壹個正在執行的2級遞歸SQL語句,並且存在壹個問題。為了解決這個問題,您需要找出是什麽遞歸SQL語句導致了這個錯誤。為此,必須在進程中開始跟蹤。
首先,執行以下SQL語句:
ALTER SESSION SET sql _ trace = TRUE
然後,執行update語句。您將看到ORA-604錯誤。接下來,執行以下語句:
ALTER SESSION SET SQL _ trace = FALSE;
現在轉到您為數據庫定義的USER_DUMP_DEST初始參數的路徑。應該有壹個帶有當前時間戳的文件。那是妳生成的跟蹤文件。您可以打開文件並檢查遞歸SQL語句,包括導致錯誤的語句。
來源/天樂軟件/文章/詳情/4787074