如何在触发器函数中排除数据库列 (Oracle)

How to Exclude DB Column in a Trigger Function (Oracle)

我在某个 table(例如 TABLE_TRIGGER)中创建了一个非常简单的触发器,它将调用一个过程(handles所有的逻辑)。这个table有一个列(例如AUDITID)我想在触发函数中排除,我的意思是,如果update 仅在 AUDITID 列中完成,不应执行该过程。

下面是触发器:

CREATE OR REPLACE TRIGGER TABLE_TRIGGER_FUNCTION
   AFTER INSERT OR UPDATE
   ON TABLE_TRIGGER
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
BEGIN
    -- procedure();
END;

除了此处建议的方法外,还有其他方法吗:Oracle: excluding updates of one column for firing a trigger

这里提供的答案是我想要的 Fire trigger on updates (excluding certain fields change) 但我不确定这是否也可以使用 Oracle PL/SQL 语法来完成。

顺便说一下,我已经尝试通过排除 AUDITID 列来使用以下 WHEN 语句,但是触发器根本不起作用并且没有执行该过程。

WHEN (NEW.FILEID != OLD.FILEID OR
        NEW.DESCRIPTION != OLD.DESCRIPTION OR
        NEW.IMAGEID != OLD.IMAGEID OR
        NEW.STATETYPEID != OLD.STATETYPEID OR
        NEW.ACCESSLEVELID != OLD.ACCESSLEVELID OR
        NEW.FILETYPEID != OLD.FILETYPEID)

我不知道有什么方法可以从更新触发器中排除列,但是您可以定义它触发的列的列表,并列出所有列除了 auditid:

CREATE OR REPLACE TRIGGER TABLE_TRIGGER_FUNCTION
   AFTER INSERT OR UPDATE
   OF FILEID, -- Field list starts here...
      DESCRIPTION,
      IMAGEID,
      STATETYPEID,
      ACCESSLEVELID,
      ACCESSLEVELID,
      FILETYPEID -- ... and ends here
   ON TABLE_TRIGGER
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
BEGIN
    -- procedure();
END;

在插入期间,插入事件对 OLD 的所有引用都将导致 NULL,因此您的过程不会 运行。

考虑并参考以下代码块: 我想这就是您要找的东西。

create table hr.test(id1 int,id2 int);

create or replace procedure hr.test_proc
as
begin
  dbms_output.put_line('trigger');
end;

CREATE OR REPLACE TRIGGER test_trg
   AFTER INSERT OR UPDATE
   ON hr.test
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
BEGIN
    if updating and :old.id1 !=:new.id1 then
      null;--do nothing just as you want
    else 
      hr.test_proc;--call your proc
    end if;           
END;