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?
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.
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;
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.
Séparez-le en 2 déclencheurs. Un pour la suppression et un pour l'insertion\mise à jour.