ORA-04091:表正在变异,触发器/函数可能看不到它,ORA-06512:,ORA-06512:在“SYS.DBMS_SQL”,第 1721 行
Posted
技术标签:
【中文标题】ORA-04091:表正在变异,触发器/函数可能看不到它,ORA-06512:,ORA-06512:在“SYS.DBMS_SQL”,第 1721 行【英文标题】:ORA-04091: table is mutating, trigger/function may not see it, ORA-06512:, ORA-06512: at "SYS.DBMS_SQL", line 1721 【发布时间】:2021-04-05 02:08:03 【问题描述】:问题:创建一个名为 trg_job_date 的触发器,它将在插入或更新时将作业表中的 JOB_LAST_UPDATE 列更新为当前日期。使用插入和更新语句测试触发器 - 包括插入和更新语句。
所以我试图通过触发器更新工作中的job_last_update
,但我读到我可以在触发器中拥有我想要更新的同一张表。我的主要问题是job_last_update
仅在作业表中可用。
这里是 erd:
到目前为止,这是我的代码:
create or replace trigger trg_job_date
after insert or update
on job
for each row
begin
update job
set job_last_update = current_date;
end;
insert into job (job_code, job_description, job_chg_hour, job_last_update)
values('511', 'Hardware management', '22.11', '4/4/2021');
update job
set job_description = 'Hardware Manager'
where job_code = 511;
select * from job; --using this to test whether the trigger worked properly
触发器运行没有问题,但是当我尝试运行我的插入语句时,它给了我错误:
ORA-04091: table SQL_IUARPVSJLXIJWEVKOWRJRCSXZ.JOB is mutating, trigger/function may not see it ORA-06512: at "SQL_IUARPVSJLXIJWEVKOWRJRCSXZ.TRG_JOB_DATE", line 2
ORA-06512: at "SYS.DBMS_SQL", line 1721
我需要做什么才能让我的代码做我需要做的事情?
【问题讨论】:
从不将日期/时间值存储为字符串,这是一个设计缺陷。使用 DATE 值。 【参考方案1】:不要使用单独的更新创建新事务。在 before 触发器中使用:new
伪表将列修改为同一事务的一部分。
create or replace trigger trg_job_date
before insert or update
on job
for each row
begin
:new.job_last_update := sysdate;
end;
在此处查看文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/plsql-triggers.html#GUID-4F93F21E-BA7F-4378-87E6-46A8E4C03287
【讨论】:
我在运行您的代码时不断收到此错误:错误:TRIGGER TRG_JOB_DATE Line/Col:2/26 PLS-00103:在预期以下情况之一时遇到符号“=”::=。 ( @ % ; 指示符号 ":= 被插入到 "=" 之前以继续。我将如何解决这个问题? 我的例子中有一个错字,我已经更正了。 我明白了。谢谢!以上是关于ORA-04091:表正在变异,触发器/函数可能看不到它,ORA-06512:,ORA-06512:在“SYS.DBMS_SQL”,第 1721 行的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 ORA-04091:表正在变异,触发器/函数可能看不到它?
ORA-04091 表 ODB.EMPLOYEE 正在变异,触发器/函数可能看不到它。我的触发器有问题吗?
ORA-04091:表正在变异,触发器/函数可能看不到它,ORA-06512:,ORA-06512:在“SYS.DBMS_SQL”,第 1721 行