代码之家  ›  专栏  ›  技术社区  ›  Jown

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

  •  3
  • Jown  · 技术社区  · 8 年前

    我在某个表中创建了一个非常简单的触发器( e、 g.工作台_触发器 )这将调用一个过程( 处理所有逻辑 ). 此表有一列( e、 g.审计 )我想做什么 排除 我的意思是,如果 使现代化 仅在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) 但我不确定这是否也可以使用OraclePL/SQL语法完成。

    顺便说一句,我已经试过使用以下方法 什么时候 语句,但触发器根本不起作用,过程也未执行。

    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)
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Mureinik    8 年前

    我不知道从更新触发器中排除列的方法,但您可以定义一个列列表 启动,并列出除 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;
    
        2
  •  0
  •   Prashant Mishra    8 年前

    在插入期间,插入事件对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;