触发器引起的删除对象报错ORA-00604 ORA-20001的排查
生活随笔
收集整理的這篇文章主要介紹了
触发器引起的删除对象报错ORA-00604 ORA-20001的排查
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
近期,某客戶反饋應用廠商在數據庫維護時,出現視圖不能刪除問題。檢查報錯信息后,初步判斷可能是賬戶權限或觸發器問題導致的此問題。
經過測試,可以發現使用SYS/SYSTEM賬號可以正常創建刪除;業務賬號可以創建、不能刪除,基本確定是有相關安全策略或觸發器的影響。
但是到底哪些觸發器影響呢,系統中有很多默認及應用的觸發器,排查起來還有是難度的。
本次使用10046trace來跟蹤刪除語句,查找出對應的觸發器SQL,應用廠商人員據此很快找到了對應的觸發器。之后可以通過禁用觸發器或使用高權限賬戶(system)來刪除處理
過程如下:
1.排除權限問題
SYS用戶驗證“ SQL> create table TEST111.test20210303 as select * from dba_users; Table created.SQL> drop table TEST111.test20210303 ; Table dropped.業務用戶驗證: SQL> show user USER is "TEST111" SQL> create table test20210303 as select * from dba_users; Table created.SQL> drop table test20210303 ; drop table test20210303 * ERROR at line 1: ORA-00604: error occurred at recursive SQL level 1 ORA-20001: TEST111.TEST20210303 ?????drop??! ORA-06512: at line 7檢查業務用戶的權限: SQL> select * from dba_role_privs where grantee='TEST111';GRANTEE GRANTED_ROLE ADM DEF ------------------------------ ------------------------------ --- --- TEST111 RESOURCE NO YES TEST111 DBA NO YES TEST111 CONNECT NO YES2.10046跟蹤分析的過程
1.查出進程的SID及OSPID SQL> select sid from v$mystat where rownum=1;SID ----------786 SQL> select b.spid,a.sid,a.username,a.program,a.machine,BLOCKING_SESSION 2 from v$session a,v$process b 3 where a.paddr=b.addr and a.sid=786;SPID SID USERNAME ------------------------ ---------- ------------------------------ PROGRAM ------------------------------------------------ MACHINE ---------------------------------------------------------------- BLOCKING_SESSION ---------------- 24317 786 TEST111 sqlplus@nf-dboracle (TNS V1-V3) nf-dboracle2.新開一個會話連接打開10046 TRACE SQL> oradebug setospid 24317 Oracle pid: 92, Unix process pid: 24317, image: oracle@nf-dboracle (TNS V1-V3) SQL> oradebug event 10046 trace name context forever,level 12; Statement processed. 3.原進程執行刪除語句 SQL> drop table test20210303 ; drop table test20210303 * ERROR at line 1: ORA-00604: error occurred at recursive SQL level 1 ORA-20001: TEST111.TEST20210303 ?????drop??! ORA-06512: at line 74.停止10046 TRACE SQL> oradebug tracefile_name /u01/app/oracle/diag/rdbms/orclpri/orcl/trace/orcl_ora_24317.trc SQL> oradebug event 10046 trace name context off; Statement processed.5.格式化后檢查分析10046 TRACE文件 ******************************************************************************** ********************************************************************************SQL ID: asrh3b8ngw9zg Plan Hash: 0drop table test20210303 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 0.00 0.00 0 0 0 0Misses in library cache during parse: 1 Optimizer mode: ALL_ROWS Parsing user id: 124 Elapsed times include waiting on following events:Event waited on Times Max. Wait Total Waited---------------------------------------- Waited ---------- ------------SQL*Net message from client 1 35.97 35.97log file sync 1 0.00 0.00SQL*Net break/reset to client 2 0.00 0.00SQL*Net message to client 1 0.00 0.00 …………………………之后有如下語句 DECLAREl_errmsg VARCHAR2(100) := '不允許進行drop操作!'; BEGINIF ora_login_user NOT IN ('SYS','SYSTEM','DATA_MONITOR') THENraise_application_error(-20001, ora_dict_obj_owner||'.'||ora_dict_obj_name||' '||l_errmsg);END IF;END;?
總結
以上是生活随笔為你收集整理的触发器引起的删除对象报错ORA-00604 ORA-20001的排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TopCoder SRM 678 Div
- 下一篇: 股市前复权、后复权与不复权