暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle ORA-04091: 表正在变异,触发器/函数可能看不到

askTom 2017-10-20
441

问题描述

嗨,

我在触发器中收到 “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来访问您从表中选择的值:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论