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

DB2 Discussion :

Trigger sur une même table


Sujet :

DB2

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut Trigger sur une même table
    Bonjour,

    Me voila fraichement débarqué sur ce forum pour déjà appeler au secours.
    En même temps je suis pas un killer SQL DB2 ...


    J'ai essayé de simplifier au maximum ma demande.

    J'ai la table suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE ARTICLE ( 
        ARTID       DECIMAL(8,0) NOT NULL DEFAULT 0.0,
        ARTCOLOR	CHARACTER(3) NOT NULL DEFAULT ' ',
        ARTTVA      CHARACTER(1),
        PRIMARY KEY(ARTID,ARTCOLOR)
    )
    qui me permet de stocker le code article, la couleur et son code TVA.
    Un meme code article peut donc avoir plusieurs couleurs.

    Mon problème :
    Le code TVA doit etre le meme pour un meme code article. Sauf que mon appli ne me permet de ne modifier qu'une ligne à la fois. Je dois donc parcourir toutes les lignes du même article et lui imposer le même code TVA.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     ARTID     ARTCOLOR     ARTTVA    
     --------  -----------  --------- 
     23400276  B32          1         
     23400276  V03          1         
     23400276  R90          1
    J'aimerais donc à partir d'un trigger ou d'une procédure stockée, pouvoir effectuer la modif de toutes les lignes dès qu'une ligne de cet article est modifiée.

    Pour le moment le trigger que j'ai créé effectue des boucles infinie ...

    Quelqu'un a t'il la solution miracle pour effectuer cette manipulation ???



    Merci d'avance

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut Pourquoi un trigger ?
    Sur quel OS travailles-tu et dans quel langage ?

    Pourquoi ne pas faire un update SQL directement dans le programme ? Pourquoi vouloir un trigger pour fair ela mise à jour ?

  3. #3
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Par défaut
    Tu y gagnerais en facilité en utilisant 2 tables en relation.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut
    Il s'agit d'une appli ... multi systèmes !
    Base de données sur aix
    Appli de traitement sur Serveur Windows 2003
    Modif de données par appli ou par SQL
    Je ne vous détail pas tout, ça ne servirais à rien.
    Je connais les différentes solutions à mettre en oeuvre pour optimiser les traitements, dont l'update direct dans l'appli, mais pour le moment je souhaite juste effectuer ma manip à partir d'un trigger, surtout par manque de temps.

    De plus je ne peux en aucun cas modifier l'architecure et le schéma actuel des tables !!!

    En fait je cherche vraiment à comprendre la limite d'un trigger ...

  5. #5
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Par défaut
    Citation Envoyé par lamanoo Voir le message
    Pour le moment le trigger que j'ai créé effectue des boucles infinie ...
    C'est normale puisqu'il est appelé à chaque changement et comme dans le trigger tu change une même colonne dans la même table le trigger est à nouveau appelé et ainsi de suite.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 5
    Par défaut
    Bonjour à tous !
    et merci JAb pour ton analyse de mes boucles infinies ...

    et c'est précisement la solution que je cherche ...
    N'y a t'il pas moyen de faire la mise à jour de cette table 1 seule fois sans que cela engendre des boucles infinies ???

    j'avais vu quelques part une option "no cascade" ...

  7. #7
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 56
    Par défaut
    bonjour,

    Il y a bien une option "NO CASCADE BEFORE" mais elle détermine un trigger BEFORE qui n'autorise pas les update...

    Je proposerai plutot quelque chose du genre

    DROP TRIGGER XTOF.MAJTAV;

    CREATE TRIGGER XTOF.MAJTAV
    AFTER UPDATE OF ARTTVA
    ON XTOF.ARTICLE
    REFERENCING NEW AS n
    FOR EACH ROW MODE DB2SQL
    BEGIN ATOMIC
    Declare nb INTEGER;
    SET nb = (select count(*) from XTOF.ARTICLE where artid=n.artid and arttva=n.arttva);
    IF nb = 1
    THEN update article set arttva=n.arttva where artid=n.artid;
    END IF;
    END ;

    On teste si il y a plus d'une ligne, pour l'aticle mis à jour, qui contienne le nouveau code TVA. Si il n'y en a qu'une (celle mise à jour par le premier update), on fait la mise à jour de masse.
    Cette mise à jour de masse, redéclenche le trigger mais lui même, n'en déclenche pas.

    Ca reste à optimiser mais mon idée est là : définition de la condition d'arrêt de la récursivité : si elle est atteinte, on ne fait plus d'update.

    A tester également sur un grand nombre de lignes...

Discussions similaires

  1. [9.2] Trigger sur une même table
    Par Leehan dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/03/2015, 08h57
  2. Plusieurs trigger sur une même table / Performances
    Par tchoimars dans le forum PL/SQL
    Réponses: 2
    Dernier message: 27/01/2010, 15h58
  3. Trigger Insert after sur une même table
    Par soumimasen dans le forum PL/SQL
    Réponses: 3
    Dernier message: 29/05/2008, 18h49
  4. Réponses: 2
    Dernier message: 29/09/2004, 09h07
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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