如果在更新触发器

时间:2016-07-14 05:09:30

标签: oracle triggers

我已经创建了一个before insert / update触发器,如下所示

CREATE OR REPLACE TRIGGER "AUDIT_TABLE_TRIG" BEFORE
  INSERT OR UPDATE ON AUDIT_TABLE FOR EACH ROW BEGIN :NEW.LAST_MODIFIED_DATE:=SYSDATE;
  IF :new.LAST_MODIFIED_BY = NULL THEN
    :NEW.LAST_MODIFIED_BY :=SYS_CONTEXT('USERENV','OS_USER');
  END IF;
END;

要求更新last_modified_by值与登录用户而不是OS用户相同,如果last_modified_by为null则获取OS用户ID。当我从UI更新此表时,它工作正常。上次修改的值将以登录的用户ID(因为它在update语句中传递)的形式出现。 但是当我从sql developer更新了AUDIT_TABLE中的其他一些列时,:new.last_modified_by 永远不会来 null 而是它的值与相同:old.last_modified_by

Que1-我以不太好的方式处理了这个场景

 IF :new.LAST_MODIFIED_BY = NULL || :OLD.LAST_MODIFIED_BY !=SYS_CONTEXT('USERENV','OS_USER') THEN
            :NEW.LAST_MODIFIED_BY :=SYS_CONTEXT('USERENV','OS_USER');
 END IF;

还有其他好办法可以解决这个问题吗?

Que2: 我遇到了这个场景,我很惊讶。是否是oracle触发器的标准行为,如果新变量在更新时未更改,则它们具有旧值?

1 个答案:

答案 0 :(得分:1)

尝试使用 UPDATING 谓词,这可能符合您的要求。

CREATE OR REPLACE TRIGGER "AUDIT_TABLE_TRIG" BEFORE
  INSERT OR UPDATE ON AUDIT_TABLE FOR EACH ROW BEGIN :NEW.LAST_MODIFIED_DATE:=SYSDATE;
  IF NOT UPDATING('LAST_MODIFIED_BY') THEN
    :NEW.LAST_MODIFIED_BY :=SYS_CONTEXT('USERENV','OS_USER');
  END IF;
END;