尝试创建我的第一个 oracle 触发器时出现问题

Posted

技术标签:

【中文标题】尝试创建我的第一个 oracle 触发器时出现问题【英文标题】:Issue trying to create my first oracle trigger 【发布时间】:2015-12-22 17:07:54 【问题描述】:

我正在尝试在插入或更新记录时创建触发器,其中 TESTGROUP == 'HSSAG' 将为 TESTGROUP 'HSBEJ' 创建该记录的副本.....并且当记录如果 HSSAG 已更新,则相关的 HSBEJ 记录将随之更新。

create or replace TRIGGER VAL_TESTTYPE_CLONING 
AFTER DELETE OR INSERT OR UPDATE OF TESTGROUP ON CLONING_TABLE 
FOR EACH ROW 
WHEN (new.TESTGROUP = 'HSSAG') 
BEGIN
  INSERT INTO CLONING_TABLE (TESTCOL, TESTGROUP) VALUES(:new.TESTCOL, 'HSBEJ');
END;

这是我尝试插入时遇到的错误

INSERT INTO "CLMSDBA"."CLONING_TABLE" (TESTCOL, TESTGROUP) VALUES ('3', 'HSSAG')
ORA-04091: table CLMSDBA.CLONING_TABLE is mutating, trigger/function may not see it
ORA-06512: at "CLMSDBA.VAL_TESTTYPE_CLONING", line 2
ORA-04088: error during execution of trigger 'CLMSDBA.VAL_TESTTYPE_CLONING'
ORA-06512: at line 1


One error saving changes to table "CLMSDBA"."CLONING_TABLE":
Row 3: ORA-04091: table CLMSDBA.CLONING_TABLE is mutating, trigger/function may not see it
ORA-06512: at "CLMSDBA.VAL_TESTTYPE_CLONING", line 2
ORA-04088: error during execution of trigger 'CLMSDBA.VAL_TESTTYPE_CLONING'
ORA-06512: at line 1

【问题讨论】:

表 VAL_TESTTYPE 是否有一个名为 TESTCOL 的列? (而不是例如“TestCol”?) :new.TESTCOL => :new.TESTGROUP,假设两张表有相同的列。 :新的,什么时候没有新的 对不起,我刚刚发布后发现表和列名有一些错误,我更正了,然后又出现一个对我来说没有意义的错误。 你不能插入到 triiger 中的同一个表中,如果你想替换一些值,只需使用 :new.col_name = ... 【参考方案1】:

我找到了一个很好的解决方法来改变触发器问题。希望这个 有帮助。

Mutating trigger workaround

【讨论】:

以上是关于尝试创建我的第一个 oracle 触发器时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

创建 Oracle 序列触发器

编译触发器时出现 Oracle 错误 ORA-00922

尝试使用 ORACLE 获取工作日列表时出现 ORA-00904

运行 Oracle 调度程序时出现错误:ORA-20001:必须从应用程序会话中调用此过程

创建触发器时出现错误 1064

执行脚本时出现 sql 错误。在创建存储库之前尝试删除存储库