【问题标题】:Trigger to insert data row into new table when old table is updated更新旧表时触发将数据行插入新表
【发布时间】:2018-11-28 14:53:38
【问题描述】:

只想将更新的行插入到日志表中,但以下触发器块出错:

CREATE OR REPLACE TRIGGER system_notification_audit
  AFTER INSERT OR UPDATE on ncr_system_notification
  FOR EACH ROW
BEGIN
  insert into ncr_system_notification_log
  values
    (:NEW.ID,
     :NEW.NAME,
     :NEW.Description,
     :NEW.PREFERENCE,
     :NEW.FREQUENCY,
     :NEW.IS_HIGH,
     :NEW.IS_REQUIRED,
     :NEW.UPDATED_BY,
     :NEW.UPDATED_DATE) 
   where :OLD.IS_REQUIRED <> :NEW.IS_REQUIRED;
END;

【问题讨论】:

    标签: oracle plsql database-trigger


    【解决方案1】:

    执行此操作的标准方法是使用 PL/SQL 条件:

    CREATE OR REPLACE TRIGGER system_notification_audit
     AFTER 
          INSERT OR 
          UPDATE 
    on ncr_system_notification
    FOR EACH ROW
    begin
    
        if :OLD.IS_REQUIRED <> :NEW.IS_REQUIRED then
            insert into ncr_system_notification_log
            VALUES (:NEW.ID , :NEW.NAME, :NEW.Description, :NEW.PREFERENCE, :NEW.FREQUENCY, :NEW.IS_HIGH, :NEW.IS_REQUIRED, :NEW.UPDATED_BY, :NEW.UPDATED_DATE) ;     
        end if ;
    END;
    

    【讨论】:

      【解决方案2】:

      使用insertselect 语句:

      insert into ncr_system_notification_log 
      select :NEW.ID , :NEW.NAME, :NEW.Description, :NEW.PREFERENCE, :NEW.FREQUENCY, 
             :NEW.IS_HIGH, :NEW.IS_REQUIRED, :NEW.UPDATED_BY, :NEW.UPDATED_DATE
        from dual
       where :OLD.IS_REQUIRED <> :NEW.IS_REQUIRED;
      

      假设IS_REQUIRED 是一个可为空的非负整数 列,那么nvl 函数的第二个参数的负值 可能会被假设为负整数,例如-1在不等式中:

      where nvl(:OLD.IS_REQUIRED,-1) <> nvl(:NEW.IS_REQUIRED,-1)
      

      【讨论】:

      • @APC 下面的解决方案比这个更好,因为我相信它在 :old.is_required = :new.is_required 时不需要上下文切换。
      • @piezol 在这两种情况下,处理都以我认为的相同方式完成。
      • @PardeepKumar 不客气。 IS_REQUIRED 列是否可以为空..?
      • @BarbarosÖzhan 你确定吗? APC 的解决方案根本不做插入 - 所以它不需要上下文切换到 sql 引擎。
      • @piezol 好的,你的意思是从性能的角度来看(确实影响可以忽略不计),但是插入的数据并没有什么不同。
      猜你喜欢
      • 2015-11-06
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多