2010-06-03 92 views
20

我想在表格上使用触发器,每次插入,更新或删除行时都会触发该触发器。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)。 如何知道该行是否已被删除?

回答

36

Using Triggers

检测DML操作已触发 触发器

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

所以

IF DELETING THEN ... END IF; 

应该适用于你的情况。

+2

感谢您的回答。有用。我有一些DELETING问题。 我想这并不是造成这种情况的原因new_buffer.field1 ='HBP00'。 – LeftyX 2010-06-03 13:40:21

1

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

+0

谢谢,但我想知道如何识别操作。 Alberto – LeftyX 2010-06-03 13:41:58

+1

@LeftyX这就是为什么你应该接受devio的答案,而不是Tony Andrews。 – pauloya 2013-06-26 16:08:54

4

新值(或NEW_BUFFER,因为您已将其重命名)仅在插入和更新时可用。对于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”字段1更新到别的东西。

+0

10分钟前我已经想通了;-)谢谢。阿尔贝托 – LeftyX 2010-06-03 13:49:58

18

我改变了这样的代码,它的工作原理:

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;