Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 08 August 2013 14:44

Franck2908
Participant actif
Date d'inscription: 5 Mar 2010
Messages: 85

Postgresql - partage d'id entre tables

Bonjour à tous,

après plusieurs tentatives et des recherches sur mon ami google je reste sur un échec ! je me tourne alors vers vous pour m'aider.

j'ai deux tables avec plusieurs champs mais je ne cite que ceux qui m'intéresse :
sb_data_44 avec comme identifiant rowid(serial) et un champ id_tblcommerce (integer)
tbl_commerce_test avec un champ identifiant id_commerce(serial) et un champ rowid_tbldata44

mon objectif est que chaque table reçoit l'identifiant de l'autre après une insertion (le tout en gérant éventuellement des accès simultanés)
Hors je n'arrive pas à recevoir l'id ( id_commerce) de la table tbl_commerce_test dans la table sb_data_44 (sur le champ id_tblcommerce).
tbl_commerce_test reçoit bien lui l'identifiant de sb_data_44.

je suis sur un système figé où les données sont utilisées et gérées dans par un premier logiciel métier, et dont l'organisation ne permet d'être attaquée par un second logiciel (QGIS)... d'où mon besoin de faire coincider les identifiants.

je soupçonne mon update en fin de fonction, je l'ai placé ailleurs mais rien ...

voici ma fonction

Code:

CREATE OR REPLACE FUNCTION base_sig.fct_synchro()
  RETURNS trigger AS
$BODY$
DECLARE idc integer;
DECLARE rid_dyn integer;

BEGIN
 
IF (TG_OP = 'DELETE') THEN
        DELETE FROM sch_t1_commerce.tbl_commerce_test WHERE rowid_tbldata44=OLD.rowid;
        IF NOT FOUND THEN RETURN NULL; END IF;
        RETURN OLD;
ELSIF (TG_OP = 'INSERT') THEN
        INSERT INTO sch_t1_commerce.tbl_commerce_test (rowid_tbldata44) VALUES (rid_dyn)    ;

        RETURN NEW;    
END IF;
    
RETURN NULL; 


SELECT tbl_commerce_test.id_commerce into idc FROM sch_t1_commerce.tbl_commerce_test, base_sig.sb_data_44 WHERE tbl_commerce_test.rowid_tbldata44=rid_dyn;
UPDATE base_sig.sb_data_44 SET id_tblcommerce = idc WHERE sb_data_44.rowid=rid_dyn;


END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION base_sig.fct_synchro()
  OWNER TO postgres;

et mon trigger :

Code:

CREATE TRIGGER tg_synchro
AFTER INSERT OR UPDATE OR DELETE
ON base_sig.sb_data_44
FOR EACH ROW
EXECUTE PROCEDURE base_sig.fct_synchro();
ALTER TABLE base_sig.sb_data_44;

Merci pour vos conseils

Hors ligne

 

#2 Thu 08 August 2013 16:44

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Postgresql - partage d'id entre tables

Bonjour,

Un after trigger ne peut pas mettre a jour la table sur laquelle il est activé: l'opération est terminée lorsque les AFTER triggers sont appelés.
Il faut déclarer le trigger comme BEFORE.
De plus, la ligne:

INSERT INTO sch_t1_commerce.tbl_commerce_test (rowid_tbldata44) VALUES (rid_dyn)    ;

est bizarre: rid_dyn ne prend aucune valeur.

Nicolas

En ligne

 

Pied de page des forums

Powered by FluxBB