web-dev-qa-db-fra.com

ORACLE et TRIGGERS (inséré, mis à jour, supprimé)

Je voudrais utiliser un déclencheur sur une table qui sera déclenché chaque fois qu'une ligne est insérée, mise à jour ou supprimée.

J'ai écrit quelque chose comme ça:

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 je voudrais faire les mêmes choses si la ligne est insérée, mise à jour ou supprimée, je voudrais 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 le old_buffer avec le new_buffer). Comment savoir si la ligne a été supprimée?

23
LeftyX

De à l'aide de déclencheurs :

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

Si plusieurs types d'opérations DML peuvent déclencher un déclencheur (par exemple, ON INSERT OR DELETE OR UPDATE OF Emp_tab), le corps du déclencheur peut utiliser le paramètre prédicats conditionnels INSERTING, DELETING et UPDATING pour vérifier le type d'instruction qui déclenche le déclencheur.

Alors

IF DELETING THEN ... END IF;

devrait fonctionner pour votre cas.

37
devio

J'ai changé mon code comme ça et ça marche:

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;
22
LeftyX

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). Votre déclencheur deviendrait donc:

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 de la logique à l'intérieur du déclencheur pour répondre au code qui met à jour le champ1 de "HBP000" à autre chose.

5
Tony Andrews

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

1
rkellerm