IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

delete dans un trigger


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut delete dans un trigger
    bonjour tout le monde
    j'ai fait un trigger qui vérifie si un numéro de carte de crédit ou un numéro de paiement ont été déja utilisé et le cas échéant je dois supprimer un enregistrement dans une autre table.
    mon code est le 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    CREATE OR REPLACE TRIGGER NO_CRT_CREDIT
    BEFORE INSERT OR UPDATE ON PAIEMENTCREDIT
    FOR EACH ROW
    DECLARE
    	Crt   NUMBER;
            Exist NUMBER;
            Aut   NUMBER;
    BEGIN
            Crt   := 0;
            Exist := 0;
            Aut   := 0;
     
            SELECT count(nopaiement)
       	INTO Exist
       	FROM paiement
       	WHERE  paiement.nopaiement = :new.nopaiement ;
     
            IF (Exist = 0) THEN
                RAISE_APPLICATION_ERROR (-20005,'noPaiement invalide (inexistant dans la table Paiement)');
            end if;
     
    	SELECT count(distinct noclient)
       	INTO Crt
       	FROM paiementcredit, paiement, detaillivraison, commande
       	WHERE  paiementcredit.nopaiement = paiement.nopaiement AND
            paiement.nolivraison = detaillivraison.nolivraison AND
            detaillivraison.nocommande = commande.nocommande AND
    	nocarte = :new.nocarte;
     
            SELECT count(noautorisation)
       	INTO Aut
       	FROM paiementcredit
    	where noautorisation = :new.noautorisation ;
     
    	IF (Crt > 1) THEN
                DELETE FROM paiement WHERE nopaiement = :new.nopaiement;
    	    RAISE_APPLICATION_ERROR (-20005,'Carte de credit deja utilisee par un autre client');
            elsif (Aut > 0) THEN
                DELETE FROM paiement WHERE nopaiement = :new.nopaiement;
                RAISE_APPLICATION_ERROR (-20005,'numero autorisation deja utilise pour un autre paiement');
            end if;
    END;
    le problème c'est qu'il affiche le message,ce qui veut dire qu'il rentre dans le if mais le delete ne se fait pas.
    est ce que ca marche un delete dans un trigger??
    merci pour votre aide

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Oui, le DELETE dans un trigger doit marcher.

    Est-ce que vous vérifiez dans la même connexion Oracle ou dans une autre connection ?
    Etes-vous sûr que le code appelant fait COMMIT ? Si raise_application_error est exécuté, il sera récupéré par le premier gestionnaire d'exception dans la pile qui peut faire ROLLBACK.

  3. #3
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Oui, c'est votre raise_application_error qui annule le delete. Si vous voulez faire malgré tout le delete vous devez passer par une procédure autonome (autonomous_transaction) dans lequel vous committerez votre delete.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    merci d'avoir porté attention à mon problème et je m'excuse car je suis vraiment un débutant dans cet immense domaine
    j'ai écris une procédure autonome_transaction qui est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE PROCEDURE SUPPRESSION( leNopaiement paiement.nopaiement%TYPE ) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
     DELETE FROM paiement WHERE nopaiement = leNopaiement;
     COMMIT;
    END SUPPRESSION;
    et j'ai fait l'appel à cette procédure dans le trigger comme suit

    CREATE OR REPLACE TRIGGER NO_CRT_CREDIT
    BEGIN
    .....
    ....
    elsif (Aut > 0) THEN
    EXECUTE SUPPRESSION( :new.nopaiement)
    RAISE_APPLICATION_ERROR (-20005,'numero autorisation deja utilise pour un autre paiement');
    end if;
    END;

    mais il me sort les erreurs suivante:
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    37/21 PLS-00103: Encountered the symbol "SUPPRESSION" when expecting
    one of the following:
    := . ( @ % ; immediate
    The symbol ":=" was substituted for "SUPPRESSION" to continue.
    pouvez vous m'aider??

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Par défaut
    Pas besoin de mettre le execute, juste le nom de la procédure suffit. Un ; aide toujours.

    De plus, votre trigger ne fonctionnera pas. Vous faites un select sur la table de votre trigger, la table sera mutante et il y aura une erreur oracle...

    Sr référer à l'article de Pomalaix pour voir une solution. Recherche "table mutante" dans la case de recherche.

    De plus, nul besoin de supprimer explicitement la ligne insérée dans un trigger lorsqu'on détecte une erreur, le raise_application_error va faire un rollback implicite pour nous

    Atention avec le autonomous_transaction, je ne pense pas que ce ne soit ce que vous désirez vraiment faire... Une étude plus approfondie s'impose je pense.

    bpprive

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    merci infiniment pour ces explications assez précises.
    effectivement j'ai enlevé le execute et j'ai rajouté mon fameux; et ca marche.
    concernant la ligne ke je voulais supprimer est dans une autre table(la table mère[paiement]) et ma table mutante été la table(enfant[paiement_credit]).
    merci infiniment pour votre aide
    :o

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/01/2011, 14h53
  2. Annuler un DELETE dans un trigger
    Par khouja dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 07/01/2010, 17h48
  3. Empêcher le delete dans un trigger
    Par Phreak0x dans le forum MySQL
    Réponses: 4
    Dernier message: 06/12/2008, 22h09
  4. DELETE dans un trigger
    Par keuhlu dans le forum Oracle
    Réponses: 2
    Dernier message: 11/03/2006, 18h00
  5. [PL/SQL] Comment contrôler un DELETE dans un TRIGGER ?
    Par PaulBilou dans le forum Oracle
    Réponses: 9
    Dernier message: 30/09/2005, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo