触发器的问题,它编译得很好,但是当试图触发时它给出错误



设置触发后:

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,如果一个为空,另一个不为空。

相关内容