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

SQL Oracle Discussion :

Problème de trigger pour mise à jour d'un champ à partir d'une autre table [11g]


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Problème de trigger pour mise à jour d'un champ à partir d'une autre table
    Bonjour a tous,

    Je veux créer un trigger before update afin mettre à jour un champ d'une table t1 à partir d'une autre table t2.

    avec un sql simple, le problème ne se pose pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update t1 set field = (select field  from t2 where t1.id=t2.id  where exists (select null from t2 where t1.id=t2.id);
    mais lorsque je veux créer le trigger associé, j'ai toujours le problème de table mutante.
    et pour contourner ce problème. j'ai du créer une table intermédiaire pour que ça fonctionne.

    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
    CREATE OR REPLACE TRIGGER TRIG_maj BEFORE UPDATE ON t1
    DECLARE
        V_field t2.field%TYPE;
     
    BEGIN
        FOR i IN (SELECT * FROM t2) LOOP
     
            IF i.field IS NOT NULL THEN
     
             UPDATE t3 SET field =i.field  WHERE Id=i.id;  ---- sachat que table t3= t1
     
            END IF ;
        END LOOP ;
     
    END ;
    /
    sauf que le souci est que ça met à jour la table t3 et non pas la table t1 !!!!

    Pouvez-vous m'aider svp sur ce point?

    Merci d'avance

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    Vous ne pouvez pas sélectionner sur t1 dans votre trigger, faites plutôt quelque chose comme ça :
    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
    58
    59
    60
    61
    62
    63
    SQL> drop table t2;
     
    Table dropped.
     
    SQL> drop table t1;
     
    Table dropped.
     
    SQL>
    SQL> create table t1 (id_t1 number not null primary key, c varchar2(10), d_alim varchar2(10));
     
    Table created.
     
    SQL> create table t2 (id_t2 number not null primary key,
      2                   id_t1 number,
      3                   d_src varchar2(10),
      4                   CONSTRAINT id_fk FOREIGN KEY (id_t1) REFERENCES t1(id_t1));
     
    Table created.
     
    SQL>
    SQL> insert into t1 (id_t1, c) values (1, 'test 1');
     
    1 row created.
     
    SQL> insert into t1 (id_t1, c) values (2, 'test 2');
     
    1 row created.
     
    SQL>
    SQL> insert into t2 (id_t2, id_t1, d_src) values (1, 1, 'alim 1');
     
    1 row created.
     
    SQL>
    SQL> create or replace trigger trig_t1
      2  before update on t1
      3  for each row
      4  declare
      5  begin
      6    select d_src into :new.d_alim from t2 where id_t1 = :old.id_t1;
      7  exception
      8    when no_data_found then
      9      NULL; --on ne fait rien simule l'existance de la clause where exists
     10  end;
     11  /
     
    Trigger created.
     
    SQL>
    SQL> update t1 set c = 'maj '|| to_char(id_t1);
     
    2 rows updated.
     
    SQL>
    SQL> select * from t1;
     
         ID_T1 C          D_ALIM
    ---------- ---------- ----------
             1 maj 1      alim 1
             2 maj 2
     
    SQL>

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre réponse, ça m'a beaucoup aidé.

    mais dans mon cas , il faut le faire comme ceci pour que ça marche.

    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
    CREATE OR REPLACE TRIGGER trig_t1
      before UPDATE Of salaire ON EMPLOYEE
      FOR each row
    declare
      v_salaire test.salaire%type;
     
       begin
          IF :NEW.salaire IS NULL THEN
       SELECT salaire INTO v_salaire FROM test where employee_id= :NEW.employee_id;
          :NEW.salaire := v_salaire;
           END IF;   
       exception
        when no_data_found then
          NULL; 
       end;
    /

    Amicalement

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/11/2010, 10h10
  2. [WD14] mise à jour d'un enregistrement à partir d'une autre table
    Par piogo113 dans le forum WinDev
    Réponses: 9
    Dernier message: 05/05/2010, 19h06
  3. mise à jour d'un champ à partir d'un autre
    Par gravia dans le forum VBA Access
    Réponses: 5
    Dernier message: 04/05/2008, 14h25
  4. Réponses: 6
    Dernier message: 29/06/2006, 14h00
  5. Réponses: 3
    Dernier message: 09/07/2004, 10h23

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