问题描述
嗨,
我在触发器中收到 “ORA-04091: 表正在突变,触发器/函数可能看不到”。
请找到测试用例的详细信息,如下所示:
现在为表测试的ANALYZED_BY列创建更新触发器:
触发器已创建。
现在,当我尝试使用以下查询更新ANALYZED_BY列时:
它给出错误:
ORA-04091: 表CUST_BUG.TEST正在变异,触发器/函数可能看不到
ORA-06512: 在 “CUST_BUG.CUST_BUG_SEND_ASSIGNMENT_EMAIL”,8号线
ORA-04088: 触发器 “CUST_BUG.CUST_BUG_SEND_ASSIGNMENT_EMAIL” 执行时出错
请让我知道如何解决这个问题。
谢谢,
子哈希
我在触发器中收到 “ORA-04091: 表正在突变,触发器/函数可能看不到”。
请找到测试用例的详细信息,如下所示:
create table test(bug_number number, subject varchar2(50),ANALYZED_BY varchar2(50)); insert into test(bug_number,subject) values(12345,'This is a test issue'); insert into test(bug_number,subject) values(12346,'This is a code issue, pls fix'); insert into test(bug_number,subject) values(12347,'This is a test issue, pls update test');复制
现在为表测试的ANALYZED_BY列创建更新触发器:
create or replace TRIGGER CUST_BUG_SEND_ASSIGNMENT_EMAIL after UPDATE of ANALYZED_BY ON test for each row when (NEW.ANALYZED_BY is not null) DECLARE l_plain CLOB; l_html CLOB; cust_bug_number number; bug_subject varchar2(100); BEGIN select bug_number, subject into cust_bug_number,bug_subject from test where bug_number=:new.bug_number; END; /复制
触发器已创建。
现在,当我尝试使用以下查询更新ANALYZED_BY列时:
update test set ANALYZED_BY='SUBHASKU' where bug_number=12345;复制
它给出错误:
ORA-04091: 表CUST_BUG.TEST正在变异,触发器/函数可能看不到
ORA-06512: 在 “CUST_BUG.CUST_BUG_SEND_ASSIGNMENT_EMAIL”,8号线
ORA-04088: 触发器 “CUST_BUG.CUST_BUG_SEND_ASSIGNMENT_EMAIL” 执行时出错
请让我知道如何解决这个问题。
谢谢,
子哈希
专家解答
您无法查询导致触发器在触发器本身内部触发的表。
但是在这种情况下,我认为没有必要。您可以使用: new来访问您从表中选择的值:
另外: 我看到触发器被称为 “CUST_BUG_SEND_ASSIGNMENT_EMAIL”。建议您使用utl_mail发送电子邮件...
不要这样做!
这可能导致巨大的错误。发送电子邮件是非事务性的。一旦发送,就发送了。如果有错误或错误导致回滚,电子邮件仍然会消失。但是争吵不会改变!
http://www.oracle.com/technetwork/testcontent/o58asktom-101055.html
理想情况下,一旦您确定更改已提交,您应该更改运行更新的代码,以便以后发送电子邮件。
如果您不能 (轻松地) 执行此操作,则可以在发送电子邮件的触发器中提交作业。然后,该作业将与update语句一起提交或回滚。
但是在这种情况下,我认为没有必要。您可以使用: new来访问您从表中选择的值:
create table test(bug_number number, subject varchar2(50),ANALYZED_BY varchar2(50)); insert into test(bug_number,subject) values(12345,'This is a test issue'); insert into test(bug_number,subject) values(12346,'This is a code issue, pls fix'); insert into test(bug_number,subject) values(12347,'This is a test issue, pls update test'); create or replace TRIGGER CUST_BUG_SEND_ASSIGNMENT_EMAIL after UPDATE of ANALYZED_BY ON test for each row when (NEW.ANALYZED_BY is not null) DECLARE l_plain CLOB; l_html CLOB; cust_bug_number number; bug_subject varchar2(100); BEGIN dbms_output.put_line( 'BUG: ' || :new.bug_number || ' Subj: ' || :new.subject ); END; / set serveroutput on update test set ANALYZED_BY='SUBHASKU' where bug_number=12345; BUG: 12345 Subj: This is a test issue 1 row updated.复制
另外: 我看到触发器被称为 “CUST_BUG_SEND_ASSIGNMENT_EMAIL”。建议您使用utl_mail发送电子邮件...
不要这样做!
这可能导致巨大的错误。发送电子邮件是非事务性的。一旦发送,就发送了。如果有错误或错误导致回滚,电子邮件仍然会消失。但是争吵不会改变!
http://www.oracle.com/technetwork/testcontent/o58asktom-101055.html
理想情况下,一旦您确定更改已提交,您应该更改运行更新的代码,以便以后发送电子邮件。
如果您不能 (轻松地) 执行此操作,则可以在发送电子邮件的触发器中提交作业。然后,该作业将与update语句一起提交或回滚。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
593次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
558次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
481次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
471次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
457次阅读
2025-04-22 00:20:37
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
430次阅读
2025-04-22 00:13:51
Oracle 19c RAC更换IP实战,运维必看!
szrsu
430次阅读
2025-04-08 23:57:08
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
414次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
358次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
355次阅读
2025-04-15 14:48:05