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

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
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: 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

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
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: 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

 

Pied de page des forums

Powered by FluxBB