Pages: 1
- Sujet précédent - TRIGGER POSTGRESQL: copie champ table dans champ autre table - Sujet suivant
#1 Thu 16 April 2015 17:10
- dan
- Juste Inscrit !
- Date d'inscription: 16 Apr 2015
- Messages: 7
TRIGGER POSTGRESQL: copie champ table dans champ autre table
Bonjour,
je tente les triggers mais je dois faire une erreur.
J'ai une table tableorigine avec un champ colonne_original que je dois recopier dans une tablecopie avec colonne_copie.
Voila ce qui ne marche pas :
Code:
DECLARE tableorigine numeric(10,2); table copiel numeric(10,2); BEGIN IF (TG_OP = 'INSERT') OR (TG_OP = 'UPDATE') THEN SELECT INTO tableorigine colonne_origine() as numeric; SELECT INTO tablecopie colonne_copie() as numeric; NEW.colonne_copie := NEW.colonne_origine; RETURN NEW; END IF; END;
qu'est ce qui ne va pas ?
Merci de votre aide, je commence les triggers
dan
Hors ligne
#2 Fri 17 April 2015 10:05
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Bonjour.
J'aurais tendance à écrire :
BEGIN
IF (TG_OP = 'INSERT') THEN
insert into tablecopie (id, colonne_copie, ....) values (NEW.id,NEW.colonne_origine, ...);
ELSEIF (TG_OP = 'UPDATE') THEN
update tablecopie set colonne_copie = NEW.colonne_origine where tablecopie.id = NEW.id;
END IF;
END;
Cordialement
JP
Dernière modification par JP LLORENS (Fri 17 April 2015 11:12)
Hors ligne
#3 Fri 17 April 2015 11:30
- dan
- Juste Inscrit !
- Date d'inscription: 16 Apr 2015
- Messages: 7
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Bonjour et merci de votre aide,
je viens d'essayer mais ça ne marche pas.
glassfish plante et m'indique :
Internal exception... ERROR RECOR NEW has no field colonne_origine..
J'ai pourtant déclarer ma table_origine
Dan
Hors ligne
#4 Fri 17 April 2015 12:08
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Y'avait un END en trop dans mon script.
Dans une base je créé une table "plu_copie" avec entre autre 2 attributs : id et libelle
Cette table est mise à jour par trigger suite à une modification d'une table "plu_vierge"
1 : création de la fonction trigger :
CREATE OR REPLACE FUNCTION test_maj()
RETURNS trigger AS
$BODY$DECLARE
BEGIN
IF (TG_OP = 'INSERT') THEN
insert into plu_copie (id, libelle) values (NEW.ogc_fid,NEW.libelle);
ELSEIF (TG_OP = 'UPDATE') THEN
update plu_copie set libelle = NEW.libelle where plu_copie.id = NEW.ogc_fid;
END IF;
return NEW;
END;$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION test_maj()
OWNER TO postgres;
2 : création du trigger
CREATE TRIGGER t_test_maj
BEFORE INSERT OR UPDATE
ON plu_vierge
FOR EACH ROW
EXECUTE PROCEDURE test_maj();
Ca reproduit votre besoin, .... et ça marche. Quand j'insère une nouvelle ligne dans plu_vierge, les infos sont copiées dans plu_copie, et quand je fais une mise à jour, la 2ème table est aussi impactée.
JP
Hors ligne
#5 Fri 17 April 2015 14:17
- dan
- Juste Inscrit !
- Date d'inscription: 16 Apr 2015
- Messages: 7
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Il me manque quelque chose que je voudrai comprendre.
Dans ton script il est noté :
Code:
insert into plu_copie (id, libelle) values (NEW.ogc_fid,NEW.libelle);
les values NEW.ogc_fid,NEW.libelle viennent d'ou ? de ta table vierge ?
Ou déclarez vous les tables dans la fonction ?
j'avoue que je suis un perdu..
dés que j'aurai compris je vais tenter votre modèle avec un seul attribut par table
merci encore
dan
Hors ligne
#6 Fri 17 April 2015 15:35
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Les valeurs NEW sont celles qui viennent d'être intégrées ou modifiées dans la table à laquelle est associé le trigger, en l’occurrence la table plu_vierge (dans ton cas tableorigine).
Dans la fonction on déclare éventuellement des variables (texte, entier, listes, ...), mais pas de table (sauf si la fonction a pour objet des créer une table et à ce moment on trouvera un create table ...). Enfin pas en l'état de mes connaissances.
On crée une fonction trigger que l'on va associer à une table via le trigger (create trigger ... c'est le déclencheur, si je fais un insert alors postgres exécute la fonction XXXX) lié à cette table. Une fonction peut être appelée par N trigger. J'ai par exemple des fonctions qui remontent automatiquement le code INSEE, l'adresse, et qui sont utilisée dans diverses applications métier (gestion des arbres, arrêts de bus, incivilités, ...).
JP
Hors ligne
#7 Fri 17 April 2015 16:23
- dan
- Juste Inscrit !
- Date d'inscription: 16 Apr 2015
- Messages: 7
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Donc en fait ça me donne çà ;
Code:
BEGIN IF (TG_OP = 'INSERT') THEN
--J'insére values NEW.colonne_copie dans ma tablecopie
Code:
insert into tablecopie (colonne_copie) values (colonne_copie); // ici c'est pas LA VALUE COLONNE_ORIGINE qui doit être insérée à la place de colonne_copie ? ELSEIF (TG_OP = 'UPDATE') THEN
-- puis j'update ma tablecopie et récupére ma.NEW.colonne_copie ?
Code:
update tablecopie set colonne_copie = NEW.colonne_copie where tablecopie.colonne_copie = NEW.colonne_copie; END IF; return NEW; END;
sinon ou est passée ma table à copier (table_origine) avec sa colonne_origine ?
juste une précision, je ne sais pas si c'est important, la donnée origine est déjà enregistrée dans sa table avant de lancer le trigger sut la copie
Hors ligne
#8 Fri 17 April 2015 16:41
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Je ne suis plus sûr de comprendre le problème.
Si le besoin besoin à l'origine est juste de copier les données de table_origine dans tablecopie alors lancer la requête:
insert into tablecopie (colonne_copie) (select COLONNE_ORIGINE from table_origine).
Pas besoin d'un trigger !
Hors ligne
#9 Fri 17 April 2015 17:28
- dan
- Juste Inscrit !
- Date d'inscription: 16 Apr 2015
- Messages: 7
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Excuses moi si je ne suis pas clair en mettant "J'ai une table tableorigine avec un champ colonne_original que je dois recopier dans une tablecopie avec colonne_copie", mais je pense avoir besoin d'un trigger.
Voila comment je procéde
1/ J'enregistre le parametrage de l'application en JSP (Struts / hmtl) via une IHM;
2/ les données de paramétrages sont stockées dans la table psql origine;
3/ je vais récupérer certaines de ces données origines recopiées dans une table copie ;
4/ j'utilise les données copiées pour faire des calculs en JS
5/ je réenregistre mes résultats dans copie
C'est juste le trigger qui m'embête
j'ai essayé aussi comme ça ( cette fois Glasfish ne plante pas) > un trigger dans ma table origine qui répercute ces données dans la table copie dés le paramétrage
Code:
BEGIN INSERT INTO table_copie(colonne_copie) SELECT colonne_origine FROM inserted; END;
je vais essayer ce que tu m'as mis avant
je vais bien y arriver ....
Hors ligne
#10 Fri 17 April 2015 18:27
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Bonjour,
Je reprends la question de JP: pourquoi devez-vous coper les données d'une table à l'autre ?
En général, avoir des copies des memes données dans une base peut poser des problèmes.
Vous ne pouvez pas vous servir de la table contenant les données initiales pour les calculs ?
Nicolas
Hors ligne
#11 Fri 17 April 2015 18:41
- dan
- Juste Inscrit !
- Date d'inscription: 16 Apr 2015
- Messages: 7
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Merci de votre intervention,
Des chaines de calculs utilisent des données du paramétrage d'origine à un instant T, si le paramétrage change, les calculs réalisés avec le paramétrage d'origine doivent continuer à utiliser la donnée d'origine (initiale) ( ex devis), sinon l'exemple devis devient faux dés le changement d'une donnée initiale de calcul.
Cela ne s'applique que sur certaines données d'origine.
Et puis je vais avoir rapidement besoin de croiser des données de 3 ou 4 tables ensuite, c'est aussi pour ça, si je sais le faire pour 2 tables, je saurai le faire pour 3 ou 4 en même temps.
Dan
Hors ligne
#12 Mon 20 April 2015 12:48
- dan
- Juste Inscrit !
- Date d'inscription: 16 Apr 2015
- Messages: 7
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Pouvez vous m'aider ... à copier une colonne de table dans une colonne d'une autre table AVEC UN TRIGGER
J'essaie ceci et ça focntionne pas non plus (trigger dans ma table origine)
BEGIN
INSERT INTO table_copie(colonne_copie)
SELECT colonne_origine
FROM inserted;
END;
Hors ligne
#13 Tue 05 May 2015 10:28
Re: TRIGGER POSTGRESQL: copie champ table dans champ autre table
Bonjour,
une piste ici peut-être : http://georezo.net/forum/viewtopic.php?id=97003
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
Pages: 1
- Sujet précédent - TRIGGER POSTGRESQL: copie champ table dans champ autre table - Sujet suivant