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

Pour sécuriser votre compte sur les forums du GeoRezo, nous demandons de changer votre mot de passe.

Vous allez recevoir un message pour effectuer ce changement de mot de passe.

Merci de bien respecter les règles préconisées.

#1 Mon 27 April 2015 19:51

melanie.p
Participant occasionnel
Date d'inscription: 14 Sep 2013
Messages: 18

[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

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

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

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

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

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

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

 

Pied de page des forums

Powered by FluxBB