2010-06-03 116 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;