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 avec update sur même table


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 97
    Points
    97
    Par défaut Trigger avec update sur même table
    Bonjour

    Je souhaiterai savoir s'il est possible, sous Oracle 9i, de créer un trigger s'exécutant suite à un update ou un insert et mettant à jour une colonne de cette même table (par un update) sans déclencher de boucle...ou en la controlant...

    Merci, Thig

  2. #2
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Il faut créer un trigger BEFORE INSERT OR UPDATE, si tu veux modifier la ligne en cours d'insertion/modification.
    Du style, tu auras un code du style : (euh, c'est un exemple à ne pas prendre à la lettre, c'est l'idée qui est importante)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if :old.date_derniere_modification < sysdate then
       :new.date_derniere_modification := sysdate;
    end if;
    Par contre, je crois avoir souvenir qu'on ne peut pas à partir d'un trigger d'une table modifié une autre ligne que celle en cours sur la même table (mais c'est un souvenir de 8i, cela a peut être changé depuis)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 97
    Points
    97
    Par défaut
    Merci, pour ta réponse

    Pour que je comprenne bien :

    Si je fais un update sur la colonne x de ma table, le trigger update se déclenche avant que la modif soit réellement faite sur la colonne x ...

    et je peux en profiter pour modifier la valeur d'une autre colonne y pour la même ligne en faisant dans le trigger qlq chose comme :

    :new.y := ma_nouvelle_valeur

    et j'empêche la boucle en faisant un test sur par exemple une date de modif

    c'est bien ca ?

    on peut dire que :

    new.y = sysdate <=> update table set y = sysdate where ...

    et sa déclenche aussi le trigger ?

    Merci

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Non, ce n'est pas une instruction UPDATE.
    C'est modifier l'enregistrement. Ca ne va pas redéclencher un trigger.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 97
    Points
    97
    Par défaut
    Donc, j'ai pas besoin du test :

    if :old.date_derniere_modification < sysdate then ...

    pour empêcher la boucle, c'est bien ça ?

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Oui, c'est ça, tu n'aura pas de boucle.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par Thig Voir le message
    Donc, j'ai pas besoin du test :

    if :old.date_derniere_modification < sysdate then ...

    pour empêcher la boucle, c'est bien ça ?
    Edit: J'ai mal lu ta réponse, effectivement tu n'as pas besoin du test
    non, je t'ai induit en erreur avec ma ligne de code, ce n'est pas le test en lui-même qui empêche la boucle, c'est le trigger before update en lui-même

    Cela se passe ainsi :
    1. Envoie de la requête INSERT/UPDATE par l'utilisateur
    2. Pour chaque ligne à insérer/modifier, le trigger BEFORE INSERT OR UPDATE est lancé
    3. Exécution du code contenu dans le trigger
    4. La ligne est inséré/modifié bel et bien dans la table
    Donc, si par exemple tu as la colonne A qui est calculé par B+C dans ton trigger, lorsque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    INSERT INTO MyTable
    (B,C)
    Values
    (X,Y)
     
    Le comportement de ton trigger sera identique à
    INSERT INTO MyTable
    (A,B,C)
    Values
    (X+Y, X, Y)
     
    Il n'y aura qu'une seule insertion, donc qu'un seul déclenchement du trigger
    Note que le déclenchement peut être effectué pour chacune des lignes ou bien pour la requête en entier. Ce dernier cas peut être utilisé pour faire de l'audit ou des traces, par exemple, tu peux avoir un trigger BEFORE DELETE définit au niveau du statement qui enregistre l'heure et le user qui a fait le delete dans une autre table. Même si le delete efface plusieurs ligne, le trigger sera exécuté une seule et unique fois (par contre dans ce cas, le trigger sera exécuté même si aucune ligne n'est effacé, à l'inverse du trigger sur chaque ligne qui n'est déclenché uniquement si au moins une ligne est effacée/insérée/modifiée

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 97
    Points
    97
    Par défaut
    Mais c'est superbe !

    Merci, A+ Thig

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/08/2012, 10h28
  2. Update sur une table avec conditions
    Par tibss dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/07/2011, 17h13
  3. Transaction READ COMMITED bloque UPDATE sur même table
    Par stephane.julien dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/06/2011, 13h52
  4. [trigger]Probleme d'update sur une table
    Par AlternantOracle dans le forum PL/SQL
    Réponses: 5
    Dernier message: 25/02/2010, 15h11
  5. update avec condition sur autre table
    Par allowen dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/04/2005, 15h02

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