#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