触发器引起的删除对象报错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 YES
2.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的排查相关推荐
- php zpo框架,Yii使用DeleteAll连表删除出现报错问题的解决方法
本文实例讲述了Yii使用DeleteAll连表删除出现报错问题的解决方法.分享给大家供大家参考,具体如下: 删除数据的时候,经常会遇到连联判断删除数据的条件,今天用Yii 的CDbCriteria生成 ...
- Ambari删除服务报错之CSRF protection is turned on
Ambari安装组件失败后执行 curl 删除服务报错 CSRF protection is turned on X-Requested_By HTTP Header is required 解决方案 ...
- Oracle导入TYPE对象报错ORA-02304
Oracle导入TYPE对象报错ORA-02304 Type是我们经常使用的数据库对象结构.我们在实际中,可以单独定义type类型,之后在PL/SQL代码或者数据表中使用. 在一个偶然的机会让笔者发现 ...
- Docker下删除镜像报错 (cannot be forced) - image has dependent child images
记录一次docker删除镜像报错: docker rmi 镜像Id 报错: Error response from daemon: conflict: unable to delete ae9561a ...
- HashMap遍历中删除元素报错
文章目录 一.问题描述 二.问题分析 三.解决问题 四.相关问题 一.问题描述 HashMap在遍历的时候进行删除元素报错java.util.ConcurrentModificationExcepti ...
- SQL Server 删除数据库报错 Cannot drop database dbname because it is currently in use
SQL Server 删除数据库报错 Cannot drop database "dbname" because it is currently in use SQL Server ...
- MySQL删除用户报错:ERROR 1396 (HY000): Operation DROP USER failed for ‘tsjt‘@‘127.0.0.1‘
背景: 本地安装的MySQL的MariaDB,期间创建了两个名为tsjt的不同登录ip的用户,一个为127.0.0.1,另一个为localhost.测试完毕后准备删除. 此时却发现创建的tsjt@12 ...
- Unity当GameObject.Find(““)获取不到对象报错时
Unity当GameObject.Find("")获取不到对象报错时 有时候Hierarchy明明有我们需要获取的对象,但当他不启用时,我们用GameObject.Find(&qu ...
- spring boot ajax 415,解决@RequestBody接收json对象报错415的问题
@RequestBody接收json对象报错415 前端请求: $.ajax({ url: basePath() + "/index/login.do", type : " ...
- 关于:js使用$.parseJSON字符串转json对象报错Uncaught SyntaxError- Unexpected token o in JSON at position 1
今天使用js使用$.parseJSON字符串转json对象报错Uncaught SyntaxError- Unexpected token o in JSON at position 1,一直找不到原 ...
最新文章
- tf.keras.losses.KLDivergence KL散度 损失函数 示例
- 一线大厂BAT资深移动开发者倾情打造,教你从0构建App
- Spring系列教程四:Spring对Bean的管理细节
- linux deepin “debconf: DbDriver “config“: config.dat 被另一个进程锁定:资源暂时不可用“
- 如何创建一个FeatureClass,IFeatureWorkspace 接口漫谈
- Fun 3.0 发布——资源部署、依赖下载、代码编译等功能又又又增强啦!
- 第4课 列朋波骨《小学生C++趣味编程》
- 日常小记录json文件(json.load()、json.loads()、json.dump()、json.dumps())
- leveldb——leveldb入门篇之Linux下编译配置和使用
- Linux 进程后台运行
- “世界百位名人”诠释上海世博会城市主题
- 网站如何配置CDN加速?网站域名接入腾讯云CDN的步骤(附CDN防御)
- KVM虚拟化崛起:你选Ubuntu还是Red Hat?
- Layui 表格table自定义每一列的样式
- java图书借阅系统java图书管理系统java书籍借阅系统
- 西安互联网公司和生活成本
- 小觅相机运行ORB-SLAM3
- 免费可商用图片素材网站,建议收藏
- kali2021安装RTL8188GU无线网卡[TL-WN726N]驱动
- javascript动态插入html元素