#1 Mon 27 April 2015 19:51
- melanie.p
- Participant occasionnel
- Date d'inscription: 14 Sep 2013
- Messages: 22
[Postgresql9.3] Aide pour trigger
Bonjour à tous,
Je débute avec les triggers, j'ai déjà créé quelques triggers simples, et là je complexifie petit à petit les choses.
le contexte :
- une première table profils_pedo sur lequel se déclenche le trigger
Code:
CREATE TABLE profils_pedo ( id_profil_pedo serial NOT NULL, -- identifiant automatique de la table id_expertise_pedo integer NOT NULL, -- référence à l'identifiant de la table "expertise_pedo" caractere_hydro boolean, -- caractère hydromorphe du profil CONSTRAINT pk_id_profil_pedo PRIMARY KEY (id_profil_pedo), CONSTRAINT fk_id_expertise_pedo FOREIGN KEY (id_expertise_pedo) REFERENCES expertises_pedo (id_expertise_pedo) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION)
- une seconde table expertise_pedo que je souhaite mettre à jour (une expertise peut-être liée à plusieurs profils)
Code:
CREATE TABLE expertises_pedo ( id_expertise_pedo serial NOT NULL, -- identifiant automatique de la table conclu_pedo_cct boolean, -- bilan de l'expertise selon le CCT régional CONSTRAINT pk_id_expertise_pedo PRIMARY KEY (id_expertise_pedo))
Je souhaite mettre à jour expertises_pedo.conclu_pedo_cct à partir de profils_pedo.caractere_hydro.
La valeur que je souhaite insérer dans expertises_pedo.conclu_pedo_cct est le résultat du champ pedo_cct de la vue suivante :
Code:
CREATE OR REPLACE VIEW expertises_cct AS SELECT profils_pedo.id_expertise_pedo, bool_or(profils_pedo.caractere_hydro) AS pedo_cct FROM profils_pedo GROUP BY profils_pedo.id_expertise_pedo;
J'ai donc créé le trigger et la fonction suivante qui marche mais qui à chaque insert ou update d'une ligne de la table profils_pedo met à jour toute la table expertises_pedo. Or je voudrais que l'update se fasse seulement sur la ligne impactée.
Je sais comment faire quand le champ qui déclenche le trigger et celui à mettre à jour sont dans la même table, mais dans des tables différentes, je sèche...
j’espère avoir été assez claire. Par avance, merci pour votre aide.
Code:
CREATE OR REPLACE FUNCTION calcul_conclu_pedo_cct() RETURNS trigger AS $BODY$ BEGIN UPDATE expertises_pedo SET conclu_pedo_cct = pedo_cct from expertises_cct where expertises_pedo.id_expertise_pedo = expertises_cct.id_expertise_pedo; RETURN NULL; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; CREATE TRIGGER calcul_conclu_pedo_cct AFTER INSERT OR UPDATE OF caractere_hydro ON profils_pedo FOR EACH ROW EXECUTE PROCEDURE calcul_conclu_pedo_cct();
Hors ligne
#2 Tue 28 April 2015 09:13
Re: [Postgresql9.3] Aide pour trigger
Bonjour Mélanie et bienvenue sur Georezo,
tu peux pour cela stocker le résultat de ta requête dans la variable NEW.conclu_pedo_cct. Quelque-chose comme ceci devrait fonctionner :
Code:
CREATE OR REPLACE FUNCTION calcul_conclu_pedo_cct() RETURNS trigger AS $BODY$ BEGIN SELECT pedo_cct from expertises_cct WHERE id_expertise_pedo = NEW.expertise_pedo into NEW.conclu_pedo_cct; RETURN NEW; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; CREATE TRIGGER calcul_conclu_pedo_cct AFTER INSERT OR UPDATE OF caractere_hydro ON profils_pedo FOR EACH ROW EXECUTE PROCEDURE calcul_conclu_pedo_cct();
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#3 Tue 28 April 2015 10:09
- melanie.p
- Participant occasionnel
- Date d'inscription: 14 Sep 2013
- Messages: 22
Re: [Postgresql9.3] Aide pour trigger
Salut Mathieu,
Merci pour ce petit bout de code.
Malheureusement il me dit "Erreur : l'enregistrement NEW n'a pas de champ "conclu_pedo_cct"...
Mélanie, une ceneuse ;-)
Hors ligne
#4 Tue 28 April 2015 10:57
Re: [Postgresql9.3] Aide pour trigger
Désolé pour le démarrage à froid de ce matin :-)
Voilà qui fonctionne :
Code:
CREATE OR REPLACE FUNCTION calcul_conclu_pedo_cct() RETURNS trigger AS $BODY$ BEGIN WITH valeur AS (SELECT bool_or(profils_pedo.caractere_hydro) AS conclu FROM profils_pedo WHERE id_expertise_pedo = NEW.id_expertise_pedo GROUP BY id_expertise_pedo) UPDATE expertises_pedo SET conclu_pedo_cct = conclu FROM valeur WHERE id_expertise_pedo = NEW.id_expertise_pedo; RETURN NULL; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; CREATE TRIGGER calcul_conclu_pedo_cct AFTER INSERT OR UPDATE OF caractere_hydro ON profils_pedo FOR EACH ROW EXECUTE PROCEDURE calcul_conclu_pedo_cct();
Dernière modification par MathieuB (Tue 28 April 2015 10:58)
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#5 Tue 28 April 2015 11:46
- melanie.p
- Participant occasionnel
- Date d'inscription: 14 Sep 2013
- Messages: 22
Re: [Postgresql9.3] Aide pour trigger
Merci Mathieu, ça marche nickel ! en fait, c'était tout simple mais je n'étais pas du tout partie dans cette direction ;-)
Bonne journée
Hors ligne