ORACLE和TRIGGERS(插入,更新,删除)

时间:2010-06-03 11:37:18

标签: oracle triggers

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

我写了这样的话:

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)。 如何知道该行是否已被删除?

4 个答案:

答案 0 :(得分:37)

来自Using Triggers

  

检测被解雇的DML操作   触发器

     

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

所以

IF DELETING THEN ... END IF;

应该适合您的情况。

答案 1 :(得分:22)

我已经改变了我的代码并且它有效:

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;

答案 2 :(得分:4)

NEW值(或重命名为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') 

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

答案 3 :(得分:1)

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