【问题标题】:ORACLE and TRIGGERS (inserted, updated, deleted)ORACLE 和触发器(插入、更新、删除)
【发布时间】:2011-02-27 06:36:05
【问题描述】:

我想在表上使用触发器,每次插入、更新或删除行时都会触发该触发器。

我是这样写的:

CREATE or REPLACE TRIGGER test001
  AFTER INSERT OR DELETE OR UPDATE ON tabletest001
  REFERENCING OLD AS old_buffer NEW AS new_buffer 
  FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00') 

它有效。 因为如果插入、更新或删除行,我想做同样的事情,我想知道触发器中发生了什么。 我想我可以设法找到该行是否被插入或更新(我可以用 new_buffer 检查 old_buffer)。 如何知道该行是否已被删除?

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    将其分成 2 个触发器。一个用于删除,一个用于插入\更新。

    【讨论】:

    • 谢谢,但我想知道如何识别操作。阿尔贝托
    • @LeftyX 这就是为什么你应该接受 devio 的回答,而不是 Tony Andrews。
    【解决方案2】:

    来自Using Triggers

    检测触发的 DML 操作 触发器

    如果有不止一种类型的 DML 操作 可以触发触发器(例如,ON 插入、删除或更新 Emp_tab),触发器主体可以使用 条件谓词插入, 删除和更新以检查哪个 触发触发器的语句类型。

    所以

    IF DELETING THEN ... END IF;
    

    应该适用于您的情况。

    【讨论】:

    • 感谢您的回答。有用。我在删除方面遇到了一些问题。我想这不是造成这种情况 new_buffer.field1 = 'HBP00' 的原因。
    【解决方案3】:

    新值(或您重命名的 NEW_BUFFER)仅在 INSERTING 和 UPDATING 时可用。对于 DELETING,您需要使用 OLD (OLD_BUFFER)。所以你的触发器会变成:

    CREATE or REPLACE TRIGGER test001
      AFTER INSERT OR DELETE OR UPDATE ON tabletest001
      REFERENCING OLD AS old_buffer NEW AS new_buffer 
      FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 
    

    您可能需要在触发器内添加逻辑,以适应将 field1 从“HBP000”更新为其他内容的代码。

    【讨论】:

    • 我在 10 分钟前就知道了 ;-) 谢谢。阿尔贝托
    【解决方案4】:

    我已经像这样更改了我的代码并且它可以工作:

    CREATE or REPLACE TRIGGER test001
      AFTER INSERT OR UPDATE OR DELETE ON tabletest001
      REFERENCING OLD AS old_buffer NEW AS new_buffer 
      FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 
    
    DECLARE
          Operation       NUMBER;
          CustomerCode    CHAR(10 BYTE);
    BEGIN
    
    IF DELETING THEN 
      Operation := 3;
      CustomerCode := :old_buffer.field1;
    END IF;
    
    IF INSERTING THEN 
      Operation := 1;
      CustomerCode := :new_buffer.field1;
    END IF;
    
    IF UPDATING THEN 
      Operation := 2;
      CustomerCode := :new_buffer.field1;
    END IF;    
    
    // DO SOMETHING ...
    
    EXCEPTION
        WHEN OTHERS THEN ErrorCode := SQLCODE;
    
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 2011-01-15
      • 2015-04-26
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      相关资源
      最近更新 更多