oracle触发器ORA-04091:表正在变异

时间:2016-01-19 23:10:59

标签: oracle

我有一个日期列为ZM的表格DWZ,需要在日期小于同一张表中的DZZ日期时设置触发器。
猜猜我的代码有错误,因为我在尝试更改DWZ日期时得到“ORA-04091:表TOMEK.ZM正在变异,触发/功能可能看不到它”。 请帮我纠正

CREATE OR REPLACE TRIGGER SDW
BEFORE UPDATE OF DWZ
ON ZM
FOR EACH ROW
DECLARE
  minimum DATE;
BEGIN
  SELECT DZZ INTO minimum
  FROM ZM z
  WHERE z.DWZ = :NEW.DWZ;
  IF :NEW.DWZ <= minimum THEN
    Raise_application_error(-20201,'Date=' ||:NEW.DWZ|| ' is wrong');
  END IF;
END;

1 个答案:

答案 0 :(得分:1)

由于您只想比较同一行中两列之间的数据,因此只需使用:new伪记录即可。无需查询表

CREATE OR REPLACE TRIGGER SDW
  BEFORE UPDATE OF DWZ
  ON ZM
  FOR EACH ROW
BEGIN
  IF :NEW.DWZ <= :new.dzz THEN
    Raise_application_error(-20201,'Date=' ||:NEW.DWZ|| ' is wrong');
  END IF;
END;

当然,在现实世界中,你永远不会使用触发器来做这类事情。你会使用检查约束。