设置触发后:
CREATE OR REPLACE TRIGGER Data_modyfikacji
BEFORE INSERT OR UPDATE OR DELETE ON Pracownik
FOR EACH ROW
BEGIN
:NEW.DataModyfikacji := sysdate;
IF :NEW.Pensja!= :OLD.Pensja THEN
UPDATE Pracownik
SET PoprzedniaPensa = :OLD.Pensja;
END IF;
end;
编译时没有错误。但当我试图触发它,并更新信息在普拉科夫表这样:
Update Pracownik
Set Pensja = 2600
Where IDPracownik = 3
我得到这个错误:
ORA-04091: table S90323.PRACOWNIK is mutating, trigger/function may not see
it
ORA-06512: at "S90323.DATA_MODYFIKACJI", line 5
ORA-04088: error during execution of trigger 'S90323.DATA_MODYFIKACJI'
请帮助。
您正在获得突变表错误,因为您的触发器正在更新触发器所基于的相同表,这是不允许在Oracle中这样做的(您将重新触发触发器,可能多次(或无限次))。您的update语句中也没有谓词,因此您将更新表中的所有行,这似乎不合逻辑。
我怀疑你要做的是为你正在更新的行设置poprzedniapensa
值。如果是这样,您应该在:new record:
CREATE OR REPLACE TRIGGER data_modyfikacji
BEFORE INSERT OR UPDATE ON pracownik
FOR EACH ROW
BEGIN
:new.datamodyfikacji := SYSDATE;
IF :new.pensja != :old.pensja
THEN
:new.poprzedniapensa = :old.pensja;
END IF;
END;
/
如果您的pensja
列可能为空,您可能需要检查IF
语句中的空,因为您的:new.pensja != :old.pensja
检查不会返回true,如果一个为空,另一个不为空。