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 :

[PL/SQL] Comment contrôler un DELETE dans un TRIGGER ?


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 38
    Points : 25
    Points
    25
    Par défaut [PL/SQL] Comment contrôler un DELETE dans un TRIGGER ?
    Oracle 9.2 Enterprise Edition sous Windows XP en poste local.
    Actuellement, je découvre les triggers.
    Je me demande comment vérifier par un trigger qu'un DELETE d'un enregistrement a bien été effectué.
    Oracle ne retourne pas d'erreur NO_DATA_FOUND.
    J'ai vu qu'il existait des curseurs implicites que l'on peut interroger par SQLERRM et SQLCODE, mais je ne sais pas comment les mettre en oeuvre dans un trigger.
    Qui pourrait me donner un exemple afin que je puisse parfaire mes connaissances ?
    D'avance merci.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est pas compliqué, si tu n'as pas d'erreur c'est que le DELETE c'est bien effectué... il n'y a rien à vérifier. Ce que tu peux faire en revanche c'est traiter les exceptions via la clause ad hoc

  3. #3
    thg
    thg est déconnecté
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 46
    Points : 55
    Points
    55
    Par défaut
    un trigger "before/after delete" par exemple, n'est declenché que si la donnée existe .... si la donnée n'existe pas , le trigger n'est pas declenché ... donc le test NO_DATA_FOUND n'a pas de sens ici ....

    Il y a certainement une raison "applicative" a ta demande, et surement un contournement possible ... peux tu nous en dire plus ? ...

    par exemple si le DELETE a lieu dans un bloc PLSQL tu peux tester SQL%ROWCOUNT ...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par orafrance
    c'est pas compliqué, si tu n'as pas d'erreur c'est que le DELETE c'est bien effectué... il n'y a rien à vérifier. Ce que tu peux faire en revanche c'est traiter les exceptions via la clause ad hoc
    Il me semble que si j'ai pas d'erreur c'est soit que le DELETE s'est bien effectué OU qu'il n'a pas pu se faire faute d'avoir trouvé l'enregistrement ciblé (il retourne le message 0 suppression effectuée).
    Or, ce qui m'intéresse c'est justement si le DELETE ne s'est pas effectué.
    Dans ce cas, est-ce exact que :
    - le trigger AFTER ou BEFORE DELETE ne semble pas s'activer
    - sur les DELETE et les UPDATE, il n'y a pas de NO_DATA_FOUND
    Citation Envoyé par thg
    par exemple si le DELETE a lieu dans un bloc PLSQL tu peux tester SQL%ROWCOUNT ...
    OK, mais j'essaye de le faire à travers un trigger.
    Citation Envoyé par Christian Soutou dans SQL pour Oracle
    Pour tester le fait que l'instruction UPDATE n'affecte aucune ligne, il faudrait utiliser un curseur implicite (SQL%FOUND) et une erreur utilisateur.
    Il dit cela a propos d'un trigger.
    Or, SQLERRM et SQLCODE ne peuvent pas être testés dans le trigger.

    En fait, et en synthèse, peut-on intercepter et simuler dans un trigger, un NO_DATA_FOUND pour un UPDATE ou un DELETE ?
    Est-on obligé de coder cela dans l'application ?

    Merci pour vos réponses qui me permettent de progresser.

  5. #5
    thg
    thg est déconnecté
    Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 46
    Points : 55
    Points
    55
    Par défaut
    Reprenons :

    Dans ce cas, est-ce exact que :
    - le trigger AFTER ou BEFORE DELETE ne semble pas s'activer
    - sur les DELETE et les UPDATE, il n'y a pas de NO_DATA_FOUND

    1 - Un trigger ne s'execute que si au moins une ligne est impactée ...
    donc, si il n'y a pas de ligne a "deleter" , le trigger ne s'execute pas ...

    2 - pas de NO_DATA_FOUND pour Delete/Update ...

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    j'avais pas bien saisi... si le but c'est de savoir combien de ligne on été supprimée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    BEGIN
    DELETE FROM matable WHERE ...;
     
    IF SQL%ROWCOUNT = 0 THEN
    DBMS_OUTPUT.PUT_LINE( 'Le trigger ne s'est pas déclenché');
    END IF;
    END;
    /

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    oui ORAFRANCE mais là c'est dans l'application.
    Donc, pas question d'utiliser un TRIGGER (pour déporter le problème côté serveur de la base) pour ce cas de figure.

    Je trouve dommage qu'un TRIGGER peut ne pas être appelé malgré la présence d'une ligne de code le concernant.

    Merci à tous les deux de m'avoir éclairé.
    Je clos le sujet.

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    trigger = déclencheur, si rien n'est supprimé, rien n'est déclenché... c'est d'une logique implacable

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    Effectivement ! En fait, j'évoque plutôt TRIGGER = EVENT !

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    oui mais si il n'y a pas de ligne supprimée il n'y a pas non plus d'événement... à part quelqu'un qui a lancé une commande inutile

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/07/2008, 11h02
  2. delete dans un trigger
    Par madimane dans le forum Oracle
    Réponses: 5
    Dernier message: 16/03/2006, 18h24
  3. DELETE dans un trigger
    Par keuhlu dans le forum Oracle
    Réponses: 2
    Dernier message: 11/03/2006, 18h00
  4. [9iR2][PL/SQL] Comment créer une vue dans un package ?
    Par mainecoon dans le forum Oracle
    Réponses: 6
    Dernier message: 22/02/2006, 08h10
  5. Réponses: 9
    Dernier message: 25/01/2006, 15h35

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