2010-06-03 5 views
20

Ich möchte einen Trigger für eine Tabelle verwenden, die jedes Mal ausgelöst wird, wenn eine Zeile eingefügt, aktualisiert oder gelöscht wird.ORACLE und TRIGGERS (eingefügt, aktualisiert, gelöscht)

Ich schrieb etwas wie folgt aus:

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') 

und es funktioniert. Da ich die gleichen Dinge tun möchte, wenn die Zeile eingefügt, aktualisiert oder gelöscht wird, würde ich gerne wissen, was im Trigger passiert. Ich denke, ich kann herausfinden, ob die Zeile eingefügt oder aktualisiert wird (ich kann den old_buffer mit dem neuen Puffer überprüfen). Wie kann ich wissen, ob die Zeile gelöscht wurde?

Antwort

36

Von Using Triggers:

die DML Betrieb erkannt wird, dass Fired ein Trigger-

Wenn mehr als eine Art von DML Betrieb einen Trigger abfeuern kann (zB ON INSERT oder DELETE oder UPDATE OF Emp_tab) kann der Trigger-Body die bedingten Prädikate INSERTING, DELETING und UPDATING verwenden, um zu prüfen, welcher Typ der Anweisung den Trigger auslöst.

So

IF DELETING THEN ... END IF; 

sollte für Ihren Fall arbeiten.

+2

Danke für Ihre Antwort. Es klappt. Ich habe ein paar Probleme mit dem Löschen. Ich denke, es ist nicht wegen dieser Bedingung gefangen new_buffer.field1 = 'HBP00'. – LeftyX

1

Trennen Sie es in 2 Trigger. Eine für das Löschen und eine für das Einfügen \ update.

+0

Danke, aber ich wollte wissen, wie die Operation zu identifizieren. Alberto – LeftyX

+1

@LeftyX Deshalb solltest du Devios Antwort akzeptieren, nicht Tony Andrews. – pauloya

4

Die neuen Werte (oder NEW_BUFFER, wie Sie sie umbenannt haben) sind nur beim EINFÜGEN und AKTUALISIEREN verfügbar. Für das Löschen müssen Sie OLD (OLD_BUFFER) verwenden. Also Ihr Trigger würde:

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') 

Sie müssen möglicherweise Logik innerhalb des Trigger hinzuzufügen, um Code zu sorgen, dass field1 Updates von ‚HBP000‘ auf etwas anderes.

+0

Ich habe es vor 10 Minuten herausgefunden ;-) Danke. Alberto – LeftyX

18

Ich habe meinen Code wie folgt geändert und es funktioniert:

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; 
Verwandte Themen