我已经创建了一个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触发器的标准行为,如果新变量在更新时未更改,则它们具有旧值?
答案 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;