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 :
Nom : schema_de_donnees.PNG
Affichages : 125
Taille : 57,6 Ko

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 :
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;
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.
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.