2010-06-03 3 views
20

Je souhaite utiliser un déclencheur sur une table qui sera déclenchée chaque fois qu'une ligne est insérée, mise à jour ou supprimée.ORACLE et TRIGGERS (inséré, mis à jour, supprimé)

j'ai écrit quelque chose comme ceci:

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

et il fonctionne. Puisque j'aimerais faire la même chose si la ligne est insérée, mise à jour ou supprimée, j'aimerais savoir ce qui se passe dans le déclencheur. Je pense que je peux réussir à trouver si la ligne est insérée ou mise à jour (je peux vérifier old_buffer avec le new_buffer). Comment puis-je savoir si la ligne a été supprimée?

Répondre

36

De Using Triggers:

Détection de l'opération DML qui a déclenché un déclencheur

Si plus d'un type de DML opération peut tirer un déclencheur (par exemple, ON INSERT OU SUPPRIMER OU MISE A JOUR OF Emp_tab), le corps du déclencheur peut utiliser les prédicats conditionnels INSERTING, DELETING et UPDATING pour vérifier quel type d'instruction déclenche le déclencheur .

Alors

IF DELETING THEN ... END IF; 

devrait fonctionner pour votre cas.

+2

Merci pour votre réponse. Ça marche. J'ai quelques problèmes avec SUPPRESSION. Je suppose qu'il n'est pas piégé à cause de cette condition new_buffer.field1 = 'HBP00'. – LeftyX

1

Séparez-le en 2 déclencheurs. Un pour la suppression et un pour l'insertion \ mise à jour.

+0

Merci, mais je voulais savoir comment identifier l'opération. Alberto – LeftyX

+1

@LeftyX C'est pourquoi vous devriez accepter la réponse de devio, pas Tony Andrews. – pauloya

4

Les nouvelles valeurs (ou NEW_BUFFER comme vous les avez renommées) ne sont disponibles que lors de l'insertion et de la mise à jour. Pour SUPPRIMER, vous devez utiliser OLD (OLD_BUFFER). Donc, votre déclencheur deviendrait:

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

Vous devrez peut-être ajouter une logique à l'intérieur du déclencheur pour répondre à un code qui met à jour field1 de « HBP000 » à autre chose.

+0

Je l'ai compris il y a 10 minutes ;-) Merci. Alberto – LeftyX

18

J'ai changé mon code comme ceci et cela fonctionne:

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;