Oracle 甲骨文中的触发器。插入或更新其他字段时更新字段

Oracle 甲骨文中的触发器。插入或更新其他字段时更新字段,oracle,triggers,Oracle,Triggers,当我有一个INSTER或“CONTADOR”的update时,我需要更新表LOG\u ALARMA的字段DATAMARKER” 我有这个,但返回静音错误 create or replace TRIGGER TRIGGER2 AFTER INSERT OR UPDATE OF CONTADOR ON LOG_ALARMA for each row BEGIN UPDATE LOG_ALARMA a SET a.DATAMARKER=(SYSDATE); END; 我看了另一个例子,他

当我有一个
INSTER
或“
CONTADOR
”的
update
时,我需要更新表
LOG\u ALARMA
的字段
DATAMARKER

我有这个,但返回静音错误

create or replace TRIGGER TRIGGER2 
AFTER INSERT OR UPDATE OF CONTADOR ON LOG_ALARMA
for each row
BEGIN
  UPDATE LOG_ALARMA a 
  SET a.DATAMARKER=(SYSDATE);
END;
我看了另一个例子,他们的工作,但我不能正确地执行这一点


如果我为触发器正文中的每一行注释该行,则它工作正常,但它会更新表中的所有行。

您不会发出update SQL语句,因为这将再次导致触发器触发

相反,您只需使用PL/SQL而不是SQL将值new.DATAMARKER设置为sysdate

在插入或更新之前也将其设置为

CREATE TABLE Mutating
(
  ID1    NUMBER,
  DATE1  DATE
)
表中的数据是

ID1 DATE1
1   09/01/2015 14:09:14
1   08/31/2015 14:09:21
2   08/30/2015 14:09:30
现在,如果id1列上发生任何更新,我想更新date1。在这种情况下,我使用了下面的触发器look

    CREATE OR REPLACE TRIGGER Mutating_trg
        before INSERT OR DELETE OR UPDATE ON Mutating
     referencing old as old new as new 
        for  each row 

        begin

            if updating  then
             :new.date1:=sysdate;
            end if;

    end;
然后我发布了更新声明

    update set Mutating id1=6 where trunc(date1)=trunc(sysdate-2)
    1 row updated
现在看看结果

ID1 DATE1
1   09/01/2015 14:09:14
6   09/02/2015 14:09:14
2   08/30/2015 14:09:30

您应该使用before语句。

如果触发器读取一个表,它就不能更改它从中读取的表。这就是为什么您出现了变异错误。我认为您试图在记录更新时记录。为此,为什么不创建一个历史记录表,并在触发器的帮助下记录更改。在BEF中使用
:new.datamarker:=sysdate
ORE触发器。在PL/SQL中将sysdate分配给变量时,您不需要查询。我正在更新您的注释,horsey!@a_horse_,带_no_name是的,我知道不需要select语句。所以我已经更新了它,谢谢。