【问题标题】:Create a trigger which will increment the comm by amount 100 whenever salary is getting incremented创建一个触发器,每当薪水增加时,该触发器将增加通讯量 100
【发布时间】:2016-01-06 03:48:13
【问题描述】:

我有一个表 emp,其中包含 empno、ename、sal、comm 和其他一些字段。我想触发一个触发器,这样当用户更新薪水时,comm 字段将增加 100。我编写了以下代码:

CREATE OR REPLACE TRIGGER trr40  
AFTER UPDATE of sal   
ON emp 
FOR EACH ROW
DECLARE
BEGIN    
  if :new.sal>:old.sal then 
    update emp set comm=comm+10;
  end if;
END;`

我收到一条错误消息,提示 system.emp 表正在变异!! 请帮忙!!

【问题讨论】:

  • 对不起,我发布到 mysql。是mysql还是oracle?
  • 好的。我将删除我的回复。请添加标签 oracle,因为 oracle 的用户会帮助您:)

标签: oracle plsql triggers


【解决方案1】:

不要将其作为单独的更新语句发出以避免此错误,因为您不能同时对同一行进行两次更新。相反,直接在此事务中设置值,并在更新之前而不是之后进行触发器测试。

CREATE OR REPLACE TRIGGER trr40  
BEFORE update of sal   
ON emp for each row 
BEGIN    
 if :new.sal>:old.sal 
 then 
   :new.comm := :old.comm+10;
  end if;
END;

【讨论】:

  • 错误表示无法更改此触发器的新值
  • 其实我看到更新是到另一个表。我的错。该其他表是否有一个正在更新回 SAL 的触发器,因此该触发器会导致对 EMP 的更新,从而导致更新回 SAL?
  • 我们在同一张表中有sal和comm
  • 创建一个触发器,每当薪水增加时,该触发器将增加通讯量 100
  • 我注意到我的分配是错误的,“=”而不是“:=”,并将 RHS 切换到 :old.com+10。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多