【问题标题】:trigger mutating error触发变异错误
【发布时间】:2018-02-19 17:45:49
【问题描述】:

我在 schema1 中有 emp 表,在 schema2 中有 emp_fianl。

emp  
empid  ename  estatus
1      abc    incomplete
2      xyz    complete
3      ifg    incomplete
4      mno    incomplete

Emp_final
empid  ename  estatus
2      xyz    complete

当 schema1 emp 表中的状态更改为完成时,我必须创建一个触发器以在 Schema2 emp_final 表中插入数据。 我在下面写了相同的触发器:

Create or replace trigger tri_emp_final  
After update on emp  
BEGIN  
IF :new.estatus='complete' then
Insert into emp_final  
(select :old.empid,:old.ename,:new.estatus from schem1.emp);  
END IF;  
END;  
/

我收到上述代码的变异错误消息。当我尝试更新 emp 表中的状态时。我是一名 java 开发人员,在 Oracle、SQL 方面没有太多经验。有人可以帮忙吗?

【问题讨论】:

  • 更新前而不是更新后尝试
  • 你已经在伪列 :old.empid, :old.name 和 :new.estatus 中有值,不需要从 schem1.emp 表中选择任何内容。该查询是错误的 - 如果它有效,它将为 schem1.emp 表中的每一行将相同的数据插入到表 emp_final 中。
  • 它没有被插入到 emp_final 表中
  • 如果您认为触发器未按预期工作,请添加一些日志记录并检查会发生什么。您确定将状态更改为“完成”吗?

标签: sql oracle triggers mutating-table


【解决方案1】:

使用

Create or replace trigger tri_emp_final  
After update on emp  for each row
BEGIN  
  IF :new.estatus='complete' then
    Insert into emp_final ( empid , ename , estatus)
    Values
    (:old.empid,:old.ename,:new.estatus );  
  END IF;  
END;  
/

你可以找到一个工作演示here

【讨论】:

  • 我得到 [Error] Compilation (1: 27): ORA-04082: NEW or OLD references not allowed in table level trigger
  • 触发器必须是for each row,我已经更新了答案。
  • 谢谢,现在我得到 ORA-04098:触发器 'TR_ODS.UPDATE_TEST_TRIG' 无效并且重新验证失败
  • 请运行create trigger ....命令,然后show errors会显示所有编译错误。
  • 数据未插入表中。
【解决方案2】:

第一件事:我们要使用 :old 和 :new,您的触发器必须是 FOR EACH ROW。所以你需要改变:before update on emp for each row. 第二:就像 Goran Stefanović 写的那样,你不要选择插入,只需使用 :old 值。

【讨论】:

    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 2019-02-19
    • 2018-07-26
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2015-02-05
    相关资源
    最近更新 更多