Bonjour,
j'essaie de de créer un trigger qui invalide la donnée au lieu de la supprimer, mais j'ai beau retourner ça dans tous les sens, je ne vois pas comment faire.
Voici les tables concernées :
L'objectif est que si un utilisateur essaie de supprimer un objet dans TA_TABLE_1, plutôt que d'obtenir le message d'erreur lui disant que la suppression est impossible en raison d'un enregistrement fils existant (ce qu'il ne comprendra pas), le champ FID_STATUT de l'objet obtienne la valeur 358 afin d'invalider cet objet.
J'ai pensé au code suivant :
Le trigger est compilé et quand je tente de supprimer l'objet depuis mon application, la suppression est empêchée et j'obtiens un mail avec mon message d'erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 create or replace TRIGGER B_DXX_TEST BEFORE UPDATE OR DELETE ON TA_TABLE_1 FOR EACH ROW DECLARE BEGIN BEGIN -- Ce bloc permet de bloquer la suppression de l'objet en permettant au reste du code d'être exécuté dans le bloc principal IF DELETING THEN RAISE_APPLICATION_ERROR(-20001, 'Suppression impossible, l''objet va être mis en "invalide".'); END IF; END; -- Passage de l'objet en "invalide" :new.FID_STATUT := 358; EXCEPTION WHEN OTHERS THEN mail.sendmail('toto@gmail.com',SQLERRM,'ERREUR TRIGGER - TA_TABLE_1','TRIGGER@gmail.com'); END;
Par contre, le champ FID_STATUT, lui, n'est pas mis à jour et je ne comprends pas pourquoi. Quelqu'un pourrait-il éclairer ma lanterne ?
Merci d'avance.
Partager