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 After Insert


Sujet :

DB2

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Trigger After Insert
    Bonjour,

    1) J'aimerais, lors de l'insertion d'une ligne dans une table, alimenter la derniere colonne de cette table de type Date, par la CURRENT DATE.
    J'ai créé le trigger suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --#SET TERMINATOR $ ;                 
    CREATE TRIGGER C01P.SDAVID_I          
      AFTER INSERT ON C01P.EMPLOYEE       
      REFERENCING NEW AS N                
      FOR EACH ROW MODE DB2SQL            
      BEGIN ATOMIC                        
        UPDATE C01P.EMPLOYEE              
        SET DATECHG  = CURRENT DATE ;     
      END                                 
      $                                   
    --#SET TERMINATOR ;
    Avec cette requete, la CURRENT DATE est insérée pour toutes les lignes, et non pas celle qui vient d'etre inserée. Comment faire pour que la CURRENT DATE ne soit positionnée que tu la ligne insérée ?

    2) Avec le trigger suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --#SET TERMINATOR $ ;                 
    CREATE TRIGGER C01P.SDAVID_U          
      AFTER UPDATE ON C01P.EMPLOYEE       
      REFERENCING NEW AS N                
      FOR EACH ROW MODE DB2SQL            
      BEGIN ATOMIC                        
        UPDATE C01P.EMPLOYEE              
        SET DATECHG  = CURRENT DATE ;     
      END                                 
      $                                   
    --#SET TERMINATOR ;
    A l'update, j'obtiens l'erreur :

    DSNT408I SQLCODE = -724, ERROR: THE ACTIVATION OF THE TRIGGER OBJECT SDAVID_U WOULD EXCEED THE MAXIMUM LEVEL OF INDIRECT SQL CASCADING
    Ou se cache l'erreur ?

    Merci d'avance

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Une question et deux remarques :

    Question :
    Pourquoi passer par un Trigger ?

    Remarques :
    1) dans la première version du Trigger l'ordre UPDATE n'a pas de clause WHERE. C'est donc normal que toutes les lignes de la tables soient modifiées.

    2) la deuxième version du Trigger AFTER UPDATE ... UPDATE devrait boucler non ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Merci pour votre réponse. Le premier trigger est un trigger agissant apres un insert. Comment coder la clause Where ?

    Je pensais utiliser les triggers pour mettre a jour une colonne timestampée de la date d'excution, pour les insert ou update sur la ligne. Dans un contexte de tests de non regression, j'aurais unloadé uniquement les lignes dont le timestamp est celui que je specifie. (unloader seulement 1000 lignes candidates au lieu de 10 millions, pour des problematiques de comparaison ulterieures)

  4. #4
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Bonjour,

    Je confirme les propos de Luc Orient, sur clause WHERE et boucle.

    Il manque une clause WHERE pour chacun des triggers. Il faut que tu précises un prédicat sur l'identifiant de ta table qui, je l'espère est unique. Cela donnerait pour l'INSERT :

    WHERE IDEMP = N.IDEMP

    Pour l'UPDATE, non seulement il te manque une clause WHERE mais en plus tu crée un trigger qui précises que chaque fois que tu fais un UPDATE sur la table EMPLOYEE, il faut faire un autre UPDATE sur la table EMPLOYEE. Tu vas donc boucler éternellement, puisque l'UPDATE déclenché par le trigger va lui-même déclencher un autre trigger, ...

    Dans la définition du trigger, il faut donc préciser pour quelles colonnes tu souhaites déclencher le trigger, par exemple toutes sauf la date bien évidemment. De cette manière, l'update réalisé par le trigger sur la date ne déclenchera lui-même aucun trigger. Cela donne :

    AFTER UPDATE OF COL1, COL2, ... ON C01P.EMPLOYEE

    Quant à la clause WHERE, tu peux te servir au choix de l'identifiant de la table OLD ou de la table NEW, sachant que j'imagine que tu ne changes jamais l'identifiant. Au cas où l'identifiant pourrait changer, alors tu dois obligatoirement te servir de la table NEW, donc une clause WHERE équivalente à celle précisée ci-dessus.

    Bonne utilisation.

  5. #5
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Pour la table C01P.EMPLOYEE quelle est la valeur par défaut de la colonne DATECHG ?

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci pdz74 . C'est nettement mieux maintenant pour l'Insert et l'Update.
    >>> Donc maintenant je suis capable d'identifier pour chaque table, les lignes ayant subies Insert ou Update. Par contre, comment faire pour les lignes Deleted ?
    J'imagine que dans ce cas, il serait necessaire de creer un trigger before Delete de la ligne, et d'ecrire la ligne dans une table annexe de meme structure ? Existe il un autre solution ?
    Merci encore

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci également a Luc

  8. #8
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    A partir du moment ou tu réalises des DELETE physiques et non des DELETE logiques (du type positionnement d'une date de fin), alors le seul moyen est en effet de se créer une table histo à l'image de ta table de gestion et de créer un trigger sur la table de gestion qui pour chaque DELETE effectue un INSERT dans la table histo. Cette logique est la bonne car une règle de base d'une bonne modélisation, c'est de ne jamais mélanger dans la même table les données de gestion et les données historisées. Le trigger serait approximativement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE  TRIGGER C01P.DELEMP                                       
            AFTER DELETE                                              
            ON C01P.EMPLOYEE                                          
            REFERENCING OLD AS OLD                                    
            FOR EACH ROW MODE DB2SQL                                  
    INSERT  INTO C01P.HEMPLOYEE ( COL1, COL2, COL3, COL4, DATECHG )   
    VALUES ( OLD.COL1 , OLD.COL2 , OLD.COL3 , OLD.COL4, CURRENT DATE )
    ;
    Au fait, pour faire le lien avec la question de Luc Orient sur lé défaut de la colonne DATECHG, j'imagine que c'est pour préciser que le trigger est éventuellement inutile lors d'un INSERT. Si le défaut, c'est la date du jour et que tu ne précises pas de valeur, DB2 te mettra cette date du jour.

    A+

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci mille fois a tous
    David

  10. #10
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par pdz74 Voir le message
    ... Au fait, pour faire le lien avec la question de Luc Orient sur lé défaut de la colonne DATECHG, j'imagine que c'est pour préciser que le trigger est éventuellement inutile lors d'un INSERT. Si le défaut, c'est la date du jour et que tu ne précises pas de valeur, DB2 te mettra cette date du jour.
    C'est tout à fait ça en effet ...

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

Discussions similaires

  1. Trigger after insertion pas validée
    Par guigeek dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/12/2006, 13h37
  2. Trigger after insertion pas validée
    Par guigeek dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/12/2006, 14h23
  3. Un Trigger After INSERT peut-il empêcher l'INSERT ?
    Par cian2006 dans le forum Oracle
    Réponses: 3
    Dernier message: 13/09/2006, 17h27
  4. Trigger after insert, sans each row, possible ??
    Par veenie dans le forum Oracle
    Réponses: 5
    Dernier message: 16/02/2006, 15h18

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