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 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

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

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

 

Pied de page des forums

Powered by FluxBB