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

PL/SQL Oracle Discussion :

Trigger, différence entre AFTER ET BEFORE


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Points : 80
    Points
    80
    Par défaut Trigger, différence entre AFTER ET BEFORE
    Bonjour,

    Je suis en auto-formation SQL Oracle avec un ami, et nous butons sur la notion des triggers.

    J'aimerais connaître réellement la différence entre une instruction AFTER (update) on ... et BEFORE (update) on ...

    Pour l'instant, ce que j'ai compris c'est qu'un trigger before va ce lancer avant l'instruction DML et qu'on va donc pouvoir vérifier si, par exemple, l'update est autorisé.

    Et donc le after s'executerais après l'instruction DML ...

    J'ai bon?

    Quels sont les autres différences?

    Ce que je n'arrive pas non plus à comprendre, c'est lorsque je vois dans un trigger AFTER que l'on récuper les :old.salary. Vu que le trigger s'exécute après l'update, on ne devrait plus pouvoir récupérer le salaire avant l'update, non ??

    Merci.

    F.

  2. #2
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,

    En fait on peut considérer que le BEFORE se lance non pas avant, mais en début du traitement de l'instruction DML, et le AFTER en fin du traitement, ce qui explique que les :old soient accessibles.
    Je penche, donc je suis

  3. #3
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    J'ai pas trop compris ici
    Citation Envoyé par fardon57 Voir le message
    .
    .
    Vu que le trigger s'exécute après l'update, on ne devrait plus pouvoir récupérer le salaire avant l'update, non ??
    Merci.
    Mais sache qu'un trigger a 2 parties qui s'executent chacunes dans sa transaction: l'en-tête et le corps du trigger.

    Quand tu as un trigger UPDATE (BEFORE ou AFTER) sur une table, ORACLE conserve au niveau de l'en-tête du trigger l'ancien enregistrement dans OLD et le nouveau dans NEW (avant même de faire quoi que ce soit).

    Le corps du trigger s'execute en début ou en fin de l'instruction DML selon que tu as choisi un BEFORE ou AFTER. A ce niveau il utilise les variables (OLD et NEW) de l'en-tete du trigger (:OLD et :NEW)

    Bref, avant même que ton instruction ne soit exécutée tu as déjà le OLD et le NEW conservés dans la session du trigger.

    PS: (juste pour que tu comprenes mieux) OLD et NEW sont des variables de l'en-tete, si le corps veut utiliser ces variables il les précède de ":"
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Désolé, mais je crains que votre explication apporte plus de trouble que de lumière.
    Citation Envoyé par rvfranck Voir le message
    Mais sache qu'un trigger a 2 parties qui s'executent chacunes dans sa transaction
    En particulier, ce point est au mieux confus, au pire fondamentalement faux.
    Un déclencheur se déroule dans la transaction en cours, il ne constitue pas une transaction séparée (sauf si déclaré expressément en mode AUTONOMOUS_TRANSACTION), et encore moins deux.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par rvfranck Voir le message
    ...
    Bref, avant même que ton instruction ne soit exécutée tu as déjà le OLD et le NEW conservés dans la session du trigger.
    ...
    Salut rvfranck,

    Que veut tu dire par "session du trigger" ?

  6. #6
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Hey hey, pourquoi autant d'acharnement sur mon post? je crois que j'ai trop parlé (non, je blague).

    Citation Envoyé par mnitu Voir le message
    Que veut tu dire par "session du trigger" ?
    Je pense (je dis bien que je pense) que lorsqu'un trigger s'execute une sorte de "session" est ouverte pour stocker les informations sur l'utilisateur qui execute le trigger, sur l'objet associé au trigger, etc... et c'est là que sont stockées les valeurs OLD et NEW

    Citation Envoyé par Pomalaix Voir le message
    Désolé, mais je crains que votre explication apporte plus de trouble que de lumière.
    En particulier, ce point est au mieux confus, au pire fondamentalement faux.
    Un déclencheur se déroule dans la transaction en cours, il ne constitue pas une transaction séparée (sauf si déclaré expressément en mode AUTONOMOUS_TRANSACTION), et encore moins deux.
    J'ai peut être pas utilisé les mots qu'il fallait dans ma reponse, mais je voulais juste dire que le trigger a deux (2) blocs qui n'ont en principe que de lien logique au niveau de la bd: un bloc peut être pris en compte dans l'execution de la DML et pas l'autre.

    Je chercherai à mon retour des références pour appuyer ce que je dis, mais si vous avez des reférences pour que je comprene que "je suis à la rue" donnez les moi s'il vous plait.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  7. #7
    Membre confirmé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Points : 534
    Points
    534
    Par défaut
    Pour revenir au post de Fardon57...
    Citation Envoyé par fardon57 Voir le message
    .
    Quels sont les autres différences?
    .
    Dans les deux (2) cas tu ne peux modifier les valeurs de :OLD.
    Avec BEFORE tu peux modifier :NEW mais pas avec AFTER.

    Je parle ici de BEFORE et de AFTER UPDATE.
    "Celui qui reconnaît consciemment ses limites est le plus proche de la perfection." Johann Wolfgang

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    BEFORE : pour autoriser/interdire des traitements (raise_application_error)
    AFTER : pour compléter les traitements (n'échouent jamais, pas de raise_application_error).
    y a aussi des spécificités after logon et pas before logon...

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 91
    Points : 80
    Points
    80
    Par défaut
    J'avoue n'être toujours pas extrêmement à l'aise avec la notion, mais je vous remercie tout de même pour les nombreuses réponses en un temps si rapide.

    Merci,

    Farid.

Discussions similaires

  1. Différence entre trigger et default
    Par pinocchio dans le forum SQL
    Réponses: 9
    Dernier message: 07/12/2011, 09h26
  2. Réponses: 2
    Dernier message: 19/09/2011, 13h09
  3. [Article] Différence entre :before et ::before, les pseudos-element en CSS3
    Par ornitho13 dans le forum Publications (X)HTML et CSS
    Réponses: 2
    Dernier message: 02/03/2011, 21h25
  4. Différence entre :before et ::before, les pseudos-element en CSS3
    Par ornitho13 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 02/03/2011, 21h25
  5. différence entre dblink et Trigger
    Par flyfrog dans le forum Oracle
    Réponses: 6
    Dernier message: 20/10/2006, 12h09

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