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 :

Trigger et insert


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Trigger et insert
    Bonjour,

    J'ai fait quelques recherches sur l'utilisation des Triggers, mais je n'ai pas trouvé mon bonheur.
    Donc voilà :

    J'ai trois tables
    - ressource (id_ressource, libellé, date, valeur)
    - user (id_user, nom, prenom,...etc)
    - histo (id_histo, id_ressource, id_user, date, old_val, new_val)

    Les premiers champs de chaque table sont des sequences incrémentées automatiquement de 1 en utilisant sequence.NEXTVAL à chaque nouvel insert.

    Nous arrivons au vif du sujet.

    Je souhaiterais que la table histo soit mise à jour (avec tous les champs rempli) après chaque update du champ date de la table ressource et ce à l'aide d'un Trigger.

    A savoir que id_ressource et id_user de la table histo proviennent respectivement de la table ressource (celle qui supportera le Trigger) et de la table user.

    J'espère que vous arriverez à comprendre mon souhait !

    Je suis en version 9i de Oracle.

    Merci et bonne soirée.

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Je ne suis pas sûr de tout avoir compris mais si votre problème est de savoir quelle est la valeur de la séquence qui a été utilisée lors de l'insertion, vous avez 2 possibilités :
    • Soit vous êtes dans un bloc PL/SQL et vous pouvez récupérer la valeur avec RETURNING
    • Soit vous êtes dans la même session, et dans ce cas, c'est Sequence.CurrVal qu'il faut interroger


    [edit]
    Voici un lien qui devrait vous aider, si j'ai bien saisi votre problème : http://www.developpez.net/forums/vie...hlight=currval
    [/edit]

  3. #3
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Tu cherches à historiser valeur à chaque modification de date ?

    Regardes :

    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
     
    SQL> desc RESSOURCE;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ID_RESSOURCE                                       NUMBER
     LIBELLÉ                                            VARCHAR2(50)
     DTE                                                DATE
     VALEUR                                             NUMBER
     
    SQL> desc HISTO;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ID_HISTO                                           NUMBER
     ID_RESSOURCE                                       NUMBER
     ID_USER                                            VARCHAR2(50)
     DTE                                                DATE
     OLD_VAL                                            NUMBER
     NEW_VAL                                            NUMBER
    J'ai mis comme valeur par défaut sysdate pour HISTO.DTE et user pour HISTO.ID_USER comme je ne sais pas quel est l'user qui fait la modif.

    Pour que id_histo soit auto-incrémenté :
    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
     
    SQL> ed
    Wrote file afiedt.buf
     
      1  create or replace trigger ti_histo before insert on HISTO
      2  for each row
      3  declare
      4     seq_id    number;
      5  begin
      6     select    seq_histo.nextVal
      7     into      seq_id
      8     from      DUAL;
      9     :new.id_histo := seq_id;
     10* end;
     11  /
     
    Trigger created.
    Maintenant on va faire un autre trigger sur RESSOURCE pour capturer les modifs de DTE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SQL> create or replace trigger tu_ressource before update of dte on RESSOURCE
      2  for each row
      3  begin
      4     insert into HISTO(id_ressource, old_val, new_val)
      5     values (:old.id_ressource, :old.valeur, :new.valeur);
      6  end;
      7  /
     
    Trigger created.
    Qq tests :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    SQL>  select *
      2   from   RESSOURCE;
     
    ID_RESSOURCE LIBELLÉ              DTE          VALEUR
    ------------ -------------------- -------- ----------
               1 Ressource 1          16/02/05          1
               2 Ressource 2          16/02/05          2
     
    -- changement de date sans changement de valeur
    SQL> update RESSOURCE
      2  set    dte = dte + 1
      3  where  id_ressource = 1;
     
    1 row updated.
     
    SQL> select *
      2  from   HISTO;
     
      ID_HISTO ID_RESSOURCE ID_USER              DTE         OLD_VAL    NEW_VAL
    ---------- ------------ -------------------- -------- ---------- ----------
             1            1 SCOTT                16/02/05          1          1
    -- c'est bien historisé
     
     
    -- changement de valeur sans changement de date 
    SQL> update RESSOURCE
      2  set    valeur = 2
      3  where  id_ressource = 1;
     
    1 row updated.
     
    SQL> select *
      2  from   HISTO;
     
      ID_HISTO ID_RESSOURCE ID_USER              DTE         OLD_VAL    NEW_VAL
    ---------- ------------ -------------------- -------- ---------- ----------
             1            1 SCOTT                16/02/05          1          1
     
    -- ce n'est pas historisé
     
     
    SQL> update RESSOURCE
      2  set    valeur = 3,
      3         dte = dte + 1,
      4         id_ressource = 3
      5  where  id_ressource = 2;
     
    1 row updated.
     
    SQL> select *
      2  from   HISTO;
     
      ID_HISTO ID_RESSOURCE ID_USER              DTE         OLD_VAL    NEW_VAL
    ---------- ------------ -------------------- -------- ---------- ----------
             1            1 SCOTT                16/02/05          1          1
             2            2 SCOTT                16/02/05          2          3

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Effectivement je ne me suis pas bien expliqué

    Pour la partie sequence tout va bien !

    C'est après ....

    Dans la table histo old_val et new_val corresponde à l'ancienne date et à la nouvelle date fraichement "updater".

    De plus, mon soucis est de savoir si je peu récupéré l'id_user de la table user qui correspond à l'utilisateur modifiant le champ date de la table resource.

    Pour info, c'est la première fois que je me penche sur les TRIGGERS.
    Il doit me manquer pas mal de renseignements
    Mais il faut bien se lancer un jour ..!!

    @ bientôt

    JF

  5. #5
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Citation Envoyé par jf-nigou
    Dans la table histo old_val et new_val corresponde à l'ancienne date et à la nouvelle date fraichement "updater".
    Ca il suffit juste d'adapter le bout de code que je t'ai fourni pour qu'il ne se base pas sur valeur...

    Citation Envoyé par jf-nigou
    De plus, mon soucis est de savoir si je peu récupéré l'id_user de la table user qui correspond à l'utilisateur modifiant le champ date de la table resource.
    Tu peux utiliser le id_user de REFERENCE en utilisant :old.id_user ou :new.id_user (valeur avant ou après modif).
    Je ne suis pas sûr d'avoir saisi.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Et bien voilà, il suffisait de le dire !

    Merci pour votre aide (et ça n'a pas trainé )

    Je clôts le sujet ...... jusqu'à une prochaine fois.

    JF

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

Discussions similaires

  1. Trigger & table "inserted"
    Par alexvdb dans le forum Développement
    Réponses: 11
    Dernier message: 29/12/2005, 00h43
  2. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38
  3. pb trigger lors insertion enregistrment!
    Par tooneygirl dans le forum Oracle
    Réponses: 9
    Dernier message: 06/12/2005, 22h57
  4. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12
  5. [trigger] update inserted?
    Par cosminutza dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/06/2005, 09h37

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