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

je voudrais utiliser un trigger sur la 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 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 ça 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 trouver si la ligne est insérée ou mise à jour (je peux vérifier l'ancien_buffer avec le nouveau_buffer). Comment puis-je savoir si la rangée a été supprimé?

21
demandé sur LeftyX 2010-06-03 15:37:18

4 réponses

Utiliser Des Déclencheurs:

détection de L'opération DML qui a tiré un Déclencheur

si plus d'un type d'opération DML peut déclencher une gâchette (par exemple, sur INSÉRER OU SUPPRIMER OU METTRE À JOUR Emp_tab) , le corps de déclenchement peut utiliser le prédicats conditionnels insertion, Suppression et mise à jour pour vérifier type de déclaration tirez sur la gâchette.

IF DELETING THEN ... END IF;

devrait fonctionner pour votre cas.

37
répondu devio 2010-06-03 11:52:35

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;
20
répondu LeftyX 2010-06-03 13:48:45

Les nouvelles valeurs (ou NEW_BUFFER comme vous les avez renommés) ne sont disponibles qu'au moment de L'insertion et de la mise à jour. Pour supprimer, vous devez utiliser OLD (OLD_BUFFER). Si votre déclencheur devient:

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 pouvez avoir besoin d'ajouter de la logique à l'intérieur du déclencheur pour prendre en compte le code qui met à jour le champ 1 de 'HBP000' à autre chose.

4
répondu Tony Andrews 2010-06-03 13:06:26

séparez-le en 2 déclencheurs. Une pour la suppression et une pour l'insertion\ update.

1
répondu rkellerm 2010-06-03 11:45:35