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 :

Création trigger niveau BDD : après MAJ de la table (rechercher dernier enregistrement et MAJ une table)


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut Création trigger niveau BDD : après MAJ de la table (rechercher dernier enregistrement et MAJ une table)
    bonjour,
    et merci d'avance pour votre retour :
    j'ai deux table T1 et T2;
    je voudrais créer un trigger sur la table T2 qui me vérifie si il y a eu un changement de type insert ou delete ou update, et ça me recalcule la table T2 pour trouver le dernier enregistrement (dernière date ) et le résultat il fait un update de T1 avec le code de T2;
    T1 (id_t1, nom_t1, cod_T4)
    T2 (id_t1, id_T4, cod_T4, date_t2)

    l'idée trigger sur T2 where update or insert or delete :
    il cherche dernier enregistrement et enregistre cod_T4 dans T1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update T1 a
    set a.cod_T4 =select cod_t4 from T2   where a.id_t1=(select max(date_t2) from t2 where id_t1 =a.id_t1)
    where id_t1=a.id_t1

    c'est l'idée que je cherche et j'arrive pas à trouver la bonne syntaxe.
    merci pour votre aide

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Bonjour,

    Tu ne pourras pas référencer directement T2 puisque c'est sur cette table que s'applique le trigger. Il faudra que tu utilises un trigger de type COMPOUND pour réaliser l'update sur T1 dans la partie AFTER STATEMENT du trigger.
    Tu peux regarder cet exemple:

    https://www.oracletutorial.com/plsql...ror-in-oracle/

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Par défaut
    mais ce n'est pas la même table. j'essaye de mettre à jour une valeur d'une table T1 en sélectionnant une autre valeur d'une autre table T2 .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create or replace trigger update_t2 after
    insert or update or delete for each row begin
    update T1 a
    set a.cod_T4 =select cod_t4 from T2   where a.id_t1=(select max(date_t2) from t2 where id_t1 =a.id_t1)
    where id_t1=a.id_t1
    end;


    merci pour votre réponse

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Ok, dans ce cas tu cherches probablement à faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace trigger update_t2 
    after insert or update or delete on t2
    for each row
    begin
      update T1 a
      set a.cod_T4 =:new.cod_t4
      where a.id_t1=:new.id_t1;
    end;

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je pense qu'il ne veut mettre à jour que cod_t4 que si la date est plus récente, peut-être 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
    create or replace trigger tga_update_t1 
    after insert or update on t2
    for each row
    begin
        if :new.date_t2 > :old.date_t2
        then 
          update T1 a
             set a.cod_T4 = :new.cod_t4
           where a.id_t1  = :new.id_t1;
        end if;
    end;
    Note, ce code ne fonctionne pas en cas de delete, je l'ai supprimé de la condition after.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964
    Par défaut
    Pourquoi vouloir stocker un résultat qui peut être facilement calculer dans une vue ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/12/2011, 17h45
  2. Réponses: 15
    Dernier message: 22/10/2007, 12h14
  3. Réponses: 2
    Dernier message: 01/06/2006, 08h58
  4. Générer une bdd après une analyse
    Par EpOnYmE187 dans le forum WinDev
    Réponses: 3
    Dernier message: 13/01/2006, 13h44
  5. Réponses: 12
    Dernier message: 22/12/2005, 10h22

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