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é?
4 réponses
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.
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;
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.
séparez-le en 2 déclencheurs. Une pour la suppression et une pour l'insertion\ update.