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

Requêtes PostgreSQL Discussion :

Trigger : Insertions multiples


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Trigger : Insertions multiples
    Bonjour,

    J'ai une requête d'ajout qui fonctionne bien si je la lance dans un fichier sql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO  sdea_intranet (link) 
           SELECT docpath||'###'||docname||'###'||destination  FROM v_csdocs_sys where d_dkey =NEW.d_dkey;

    Par contre, dans mon trigger, rien ne se passe :

    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
    -- Function: setdateintranet()
     
    -- DROP FUNCTION setdateintranet();
     
    CREATE OR REPLACE FUNCTION setdateintranet()
      RETURNS "trigger" AS
    $BODY$
    DECLARE
    	new_id integer;
    	new_link varchar; 
     
     
    BEGIN 
          IF NEW.flag_publication_intranet = 'OUI'   THEN	 
    	 NEW.d_date_publi_intranet := now();
     
            INSERT INTO  sdea_intranet (link) 
            SELECT docpath||'###'||docname||'###'||destination  FROM v_csdocs_sys where d_dkey =NEW.d_dkey;
     
     
          ELSE
            NEW.d_date_publi_intranet := NULL;
            -- on enlève la ligne dans la table
     
          END IF;
     
          RETURN NEW;
     
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE;
    ALTER FUNCTION setdateintranet() OWNER TO sdea;
    GRANT EXECUTE ON FUNCTION setdateintranet() TO public;
    GRANT EXECUTE ON FUNCTION setdateintranet() TO sdea;

    Merci de votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Quel est le code de liaison entre ce trigger et votre ... table / vue ?

    Ensuite qu'est censé faire ce trigger ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Voici le code trigger qui est sur la table,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER "trgSetDatePubliIntra"
      BEFORE INSERT OR UPDATE
      ON sdea_document
      FOR EACH ROW
      EXECUTE PROCEDURE setdateintranet();
    Le but de ce trigger est qu'à chaque évènement, je lance une requête sur une vue qui me retourne une ou plusieurs lignes selon la clef Ces lignes doivent ensuite être ajoutées ou supprimées (si existantes) dans une autre table.

    Ma requête d'ajout fonctionne bien, hors mis intégrée dans le bloc IF de la fonction trigger setdateintranet().

    Merci à vous,

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Oki et quel est votre requete d'insert / update sur la table sdea_document ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update sdea_document set flag_publication_intranet='NON' where d_dkey=102285;
    Voici une requête sur ma table général, là doit se déclencher le trigger, qui selon une condition lance la requête d'ajout dans l'autre table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     insert into sdea_intranet (link) 
     SELECT docpath||'###'||docname||'###'||destination  FROM v_csdocs_sys where d_dkey = 102285 ;
    J'ai fait un essai, la requête d'ajout fonctionne bien, si je lui envoie qu'une seule ligne, par contre dans cet exemple ci j'ai 3 lignes qui sont retournées par la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      SELECT docpath||'###'||docname||'###'||destination  FROM v_csdocs_sys where d_dkey = 102285 ;
    Le nombre de ligne ne devrait pas influencer l' Insert, non ?

    Merci encore...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    J'ai mis ma requête dans une fonction test en lui passant pour argument un champ, elle m'ajoute bien toute mes lignes dans la seconde table....
    A suivre demain...merci encore pour votre aide !

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    votre condition c'est flag_publication_intranet='OUI' pour faire l'insert.

    Donc si aucun insert n'est fait dans le cas que vous nous présentez c'est normal.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Re,

    J'ai copié la mauvaise requête, je faisais des essais sur mon exemple...

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par Mescaline Voir le message
    J'ai fait un essai, la requête d'ajout fonctionne bien, si je lui envoie qu'une seule ligne, par contre dans cet exemple ci j'ai 3 lignes qui sont retournées par la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      SELECT docpath||'###'||docname||'###'||destination  FROM v_csdocs_sys where d_dkey = 102285 ;
    Le nombre de ligne ne devrait pas influencer l' Insert, non ?
    Il devrai insérer 3 lignes dans ce cas là.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    J'ai refais une table de destination avec un seul champ, sans contrainte, sans clef primaire...

    Sur ma table source j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER "trgAddListe"
      AFTER INSERT OR UPDATE
      ON sdea_document
      FOR EACH ROW
      EXECUTE PROCEDURE add_liste();
    La fonction add_liste()

    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
    -- Function: add_liste()
     
    -- DROP FUNCTION add_liste();
     
    CREATE OR REPLACE FUNCTION add_liste()
      RETURNS "trigger" AS
    $BODY$   
    BEGIN  
     
         INSERT INTO  sdea_export_docs (link) 
    	SELECT docpath||'###'||docname||'###'||destination  FROM v_csdocs_sys where d_dkey =NEW.d_dkey;
         RETURN NEW;
     
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE;
    ALTER FUNCTION add_liste() OWNER TO sdea;
    GRANT EXECUTE ON FUNCTION add_liste() TO public;
    GRANT EXECUTE ON FUNCTION add_liste() TO sdea;
    Et mes lignes sont bien toutes copiées dans la nouvelle table, par contre, je ne comprend pas ce qui n'allait pas avant ?

  11. #11
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Parole de débutant
    Si le test 'OUI' échoue avec "flag_publication_intranet = 'OUI'" peut être qu'il contient du NULL ou (si c'est de type boolean) il faut voir du coté de YES.
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Depuis mon dernier post mes essais sont concluants.
    Ma requête fonctionne bien, depuis le départ il s'agissait surement du manque de la ligne RETURN NEW; qu'il y a après l'insert.

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

Discussions similaires

  1. Triggers BEFORE INSERT multiples sur la même table
    Par king_abdel dans le forum PL/SQL
    Réponses: 6
    Dernier message: 04/08/2010, 17h27
  2. trigger "update sur insert" avec insertion multiple
    Par harf18 dans le forum Développement
    Réponses: 4
    Dernier message: 18/05/2009, 14h46
  3. INSERT multiples avec : rs.AddNew et .Update
    Par M.Zip dans le forum ASP
    Réponses: 4
    Dernier message: 03/12/2004, 15h53
  4. pb d'insertions multiples
    Par devalender dans le forum SQL
    Réponses: 2
    Dernier message: 14/07/2004, 14h49
  5. trigger insert entre 2 serveurs
    Par Shabata dans le forum Développement
    Réponses: 5
    Dernier message: 27/05/2004, 12h00

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