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 :

Encore le trigger sur dblink_exe


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2008
    Messages : 47
    Points : 41
    Points
    41
    Par défaut Encore le trigger sur dblink_exe
    Bonjour,

    J'utilse postgres 9.0 sous windows sur mon local et un autre postgres 8.4 sur un serveur linux .

    J'ai mis deux base de donnée identique sur les deux serveurs nommée suiviBP avec la table eth0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE eth0
    (
      rx character varying(256),
      tx character varying(256),
      datecurrent date,
      heurecurrent time without time zone NOT NULL,
      CONSTRAINT eth0_pkey PRIMARY KEY (heurecurrent)
    )
    Le but de mon projet est de pouvoir récupéré chaque ligne insérer dans la table eth0 de ma base local vers la table eth0 de la base sous linux .

    Pour ce faire donc , j'ai crée un fonction f_insert_eth0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE FUNCTION f_insert_eth0()
      RETURNS trigger AS
    $BODY$
      DECLARE    	
      BEGIN                           
        PERFORM dblink_exec('host=10.128.1.2 dbname=suiviBP user=postgres port=5432 password=postgres', 'INSERT INTO eth0 (rx,tx,datecurrent,heurecurrent) VALUES (' || NEW.rx || ',' || NEW.tx || ',' || NEW.datecurrent || ',' || NEW.heurecurrent || ')');                                 
        RETURN NEW;
      END; 
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    ALTER FUNCTION f_insert_eth0() OWNER TO postgres;

    qui sera appelé par une trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER trg_insert_eth0
      AFTER INSERT
      ON eth0
      FOR EACH ROW
      EXECUTE PROCEDURE f_insert_eth0();
    Je ne pense pas qu'il y a des érreurs sur mes codes mais quand je lance un insertion quelconque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into eth0 values ('69486586','64366',current_date,current_time);

    J'ai le message d'érreur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ERREUR:  erreur de syntaxe sur ou près de « : »
    CONTEXT:  Error occurred on dblink connection named "unnamed": could not execute command.
    instruction SQL « SELECT dblink_exec('host=10.128.1.2 dbname=suiviBP user=postgres port=5432 password=postgres', 'INSERT INTO eth0 (rx,tx,datecurrent,heurecurrent) VALUES (' || NEW.rx || ',' || NEW.tx || ',' || NEW.datecurrent || ',' || NEW.heurecurrent || ')') »
    PL/pgSQL function "f_insert_eth0" line 7 at PERFORM
    la connexion dblink_exec marche correctement.

    et en effet quand dans ma fonction je n'ajoute que la valeur des rx et tx dans l'autre base cela fonctionne bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PERFORM dblink_exec('host=10.128.1.2 dbname=suiviBP user=postgres port=5432 password=postgres', 'INSERT INTO eth0 (rx,tx) VALUES (' || NEW.rx || ',' || NEW.tx || ')');

    C'est le fait que j'ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NEW.datecurrent || ',' || NEW.heurecurrent
    qui pose problème ?

    Est ce que dans un trigger pour ajouter la valeur de la colonne datecurrent et heurecurrent nouvellement inseré je ne doit pas faire appelle à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NEW.datecurrent || ',' || NEW.heurecurrent
    Quelle est la cause ? des idées ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Le problème est qu'avec ton code actuel la clause VALUES va être du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VALUES (10, 20, 2011-12-02,17:04:32.559789)
    Et ça c'est syntaxiquement invalide. Pour les colonnes de type numérique c'est bon mais pour les dates et heures, il faut passer par des chaines de caractère pour les intégrer au texte de la requête, c.a.d quelque plutôt du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VALUES (10, 20, cast ('2011-12-02' AS date), cast('17:04:32.559789' as time without time zone))

Discussions similaires

  1. trigger sur deux tables
    Par Shabata dans le forum Développement
    Réponses: 4
    Dernier message: 04/05/2004, 16h55
  2. triggers sur plusieurs bases de données
    Par Shabata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2004, 10h02
  3. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 14h16
  4. Trigger sur select
    Par bilo2000 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/02/2004, 13h39
  5. Pb Trigger sur vue
    Par cosminutza dans le forum Développement
    Réponses: 3
    Dernier message: 28/07/2003, 16h37

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