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

PostgreSQL Discussion :

Trigger : copier une donnée de table postgres dans une autre table


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    R&D
    Inscrit en
    Décembre 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 32
    Points : 16
    Points
    16
    Par défaut Trigger : copier une donnée de table postgres dans une autre table
    Bonjour,
    j'essaie en vain de recopier la donnée "origine" d'une table table_origine postgresql dans une autre colonnez "copie" de la table_copie
    Ces 2 tables existent déjà

    La table origine est alimentée par validation d'un paramétrage et je dois dés le paramétrage reporter certaine données en copies.
    J'ai positionné le trigger dans la table "origine", j'ai pas de bug dans mon déploiement ( glassfish) mais pas de copie non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- Trigger: test5.2afterInsert on copie
    -- DROP TRIGGER "test5.2afterInsert" ON origine;
    CREATE TRIGGER "test5.2afterInsert"
    AFTER INSERT
    ON origine
    FOR EACH ROW
    EXECUTE PROCEDURE "test5OK"();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- Function: "test5OK"()
    -- DROP FUNCTION "test5OK"();
    CREATE OR REPLACE FUNCTION "test5OK"()
    RETURNS trigger AS
    $BODY$
    BEGIN
    INSERT INTO table_copie(copie)
    SELECT origine
    FROM inserted;
    END;$BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100;
    ALTER FUNCTION "test5OK"()
    OWNER TO postgres;
    Ou est mon erreur, n'y aurait il pas un problème de clés , - je suis toujours débutant-)
    merci d'avance
    dan

  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,


    Pour votre cas :

    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
     
    create table t_origine(origine varchar(10));
     
    create table t_copie(cop_ori varchar(10));
     
     
    CREATE OR REPLACE FUNCTION "F_COPIE"() RETURNS trigger AS
    $BODY$
    begin
    INSERT INTO T_COPIE(COP_ORI) values (NEW.ORIGINE);
    return new;
    end;$BODY$
      LANGUAGE plpgsql ;
     
     
    CREATE TRIGGER "TR_AI_COPIE"
      AFTER INSERT
      ON t_origine
      FOR EACH ROW
      EXECUTE PROCEDURE "F_COPIE"();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    insert into t_origine values('eeee');
     
    select * from t_copie;
     
    Resultat :
    ---------------
    "eeee"

  3. #3
    Membre à l'essai
    Homme Profil pro
    R&D
    Inscrit en
    Décembre 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 32
    Points : 16
    Points
    16
    Par défaut merci
    Bonsoir,

    je croyais (d'aprés ce que j'ai lu) que " create table" définissais une nouvelle table vide (http://postgresql.developpez.com/doc...eatetable.html) , mais dans ma situation ma table "origine existe déjà.
    Ma table de copie existe aussi, donc je n'ai pas à les créer, je suis pas sûr de ce que j'avance alors je vais attendre votre réponse pour réécrire mon trigger avant de faire une boulette sur ma table origine existante..
    merci encore pour le lien
    dan

  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
    euh ce que je vous ai donné est valable pour l'exemple uniquement.

    Ca vous permettra de comprendre la démarche... et de l'adapter à votre besoin.

  5. #5
    Membre à l'essai
    Homme Profil pro
    R&D
    Inscrit en
    Décembre 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 32
    Points : 16
    Points
    16
    Par défaut re
    Bonsoir,

    vous m'aviez mis "pour votre cas", donc je pensais que c'était en corrélation avec ma demande.

    mon trigger est lancé dans ma table origine qui contient la donnée "origine" à recopier, en m'inspirant de ce que vous m'indiquez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- Function: "F_COPIE"()
    -- DROP FUNCTION "F_COPIE"();
    CREATE OR REPLACE FUNCTION "F_COPIE"()
    RETURNS trigger AS
    $BODY$
    begin
    INSERT INTO Table_copie(copie) values (NEW.origine);
    return new;
    end;
    $BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100;
    ALTER FUNCTION "F_COPIE"()
    OWNER TO postgres;
    mais pourquoi ça ne marche pas, qu'est ce qui manque.. ça parait pourtant pas compliqué..
    Juste besoin d'une explication parce que vraiment j'ai parcouru des forums ou il n'y a pas deux façons de procéder qui sont identiques..
    merci bien

  6. #6
    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
    En faisant un insert via pgadmin ca fonctionne ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    R&D
    Inscrit en
    Décembre 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2013
    Messages : 32
    Points : 16
    Points
    16
    Par défaut je change de logique
    Bonjour,
    je change de logique, la précédente ne devant pas être correcte, puisque je viens de m'apercevoir que lors du déclenchement du trigger dans la table origine, la table copie est totalement vide
    De toutes façons même avec la table copie remplie ça ne marchais pas non plus..
    Je dois donc déclencher mon trigger dans la table copie lorsque j'y entre mes données.
    Pour ne pas me tromper dans mes explications, voila mes 2 tables;

    ma_table-origine
    origine_int_id [PK serial] | origine_vch_siret | article_origine| autres colonnes | ...
    -------------------------------------------------------------------------------------------------------------------------------------------------
    300000000000000000000| siret 1111111111 | 1234...........................| ...
    310000000000000000000| siret 2222222222 | 5678...........................| ...

    ma_table-copie
    copie_int_id [PK serial] | fournisseur_int_id | [U]article_copie[/U | autres colonnes | ...
    ---------------------------------------------------------------------------------------------------------------------------------------------------
    10000000000000000000| fournisseur_A...... | *******************| ...
    10100000000000000000| fournisseur B...... | *******************| ...
    10200000000000000000| fournisseur C....... | *******************| ...

    Voila le trigger, il ne plante pas glassfish.. mais ne copie pas non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- Function: "triggertest1"()
    -- DROP FUNCTION "triggertest1"();
    CREATE OR REPLACE FUNCTION "triggertest1"()
      RETURNS trigger AS
    $BODY$begin
    SELECT article_origine FROM table_origine;
    SELECT article_copie FROM table_copie;
    SET article_copie = article_origine;
    END;
    $BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100;
    ALTER FUNCTION "test1"()
    OWNER TO postgres;
    je suis loin d'être un pro ..
    merci beaucoup de vos explications, je me demande si je n'auari pas aussi un souçi avec les clés ?

Discussions similaires

  1. [AC-2003] copier les données d'un texte_box dans une liste_box
    Par facteur dans le forum VBA Access
    Réponses: 4
    Dernier message: 17/04/2014, 14h33
  2. [AC-2003] récupérer une donnée à un endroit précis dans une table
    Par justine' dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/04/2011, 17h39
  3. Copier les données de plusieurs colonnes dans une nouvelle feuille
    Par lolonico1974 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/07/2010, 07h51
  4. Réponses: 1
    Dernier message: 26/09/2007, 17h16
  5. Réponses: 12
    Dernier message: 20/04/2006, 14h23

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