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 15 September 2011 10:49

Roxane
Participant occasionnel
Date d'inscription: 9 Aug 2011
Messages: 15

[Postgre/Postgis] Déclanchement trigger UPDATE

Bonjour,

Je débute avec les triggers...
Je dois mettre à jour un champ de ma table en fonction de la mise à jour de deux autres champs de cette même table.
Pour ce faire j'ai créé une fonction trigger et le trigger associé:

CREATE OR REPLACE FUNCTION trig_id_obj_hab()
  RETURNS trigger AS
$BODY$
    BEGIN
    IF (id_hab='UPDATE') THEN
    UPDATE habitat SET id_obj=num_site||'HAB'||id_hab;
END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION trig_id_obj_hab() OWNER TO postgres;

CREATE TRIGGER maj_id_obj
  AFTER UPDATE
  ON habitat
  FOR EACH ROW
  EXECUTE PROCEDURE trig_id_obj_hab();

Cependant, quand dans QGIS je crée un nouvel objet, il m'écrit une nouvelle ligne avec un nouvel id_hab mais ne met pas à jour mon champ id_obj.

Peut-être n'ai-je pas bien compris le fonctionnement des triggers...
Merci d'avance pour votre aide.

Roxane

Hors ligne

 

#2 Thu 15 September 2011 11:29

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [Postgre/Postgis] Déclanchement trigger UPDATE

Roxane a écrit:

Bonjour,

Je débute avec les triggers...
Je dois mettre à jour un champ de ma table en fonction de la mise à jour de deux autres champs de cette même table.
Pour ce faire j'ai créé une fonction trigger et le trigger associé:

LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION trig_id_obj_hab() OWNER TO postgres;

CREATE TRIGGER maj_id_obj
  AFTER UPDATE
  ON habitat
  FOR EACH ROW
  EXECUTE PROCEDURE trig_id_obj_hab();

Cependant, quand dans QGIS je crée un nouvel objet, il m'écrit une nouvelle ligne avec un nouvel id_hab mais ne met pas à jour mon champ id_obj.

Peut-être n'ai-je pas bien compris le fonctionnement des triggers...
Merci d'avance pour votre aide.

Roxane


Bonjour,

Je ne connais pas trop les triggers, mais quelques elements du code paraissent curieux il me semble:

Il n'y a pas dans votre fonction de trigger de reference a la ligne (au record) concerné par l'operation:
Les objets spéciaux NEW et OLD référencent la ligne concernée par l'operation. ces objets contiennent la ou les valeurs a tester et a mettre a jour.
Vous testez id_hab pour une valeur UPDATE: a quoi correspond-elle ?
Pour savoir quelle est l'operation déclenchant le trigger (insert, update), la variable speciale TG_OP doit etre utilisée. Dans votre cas, c'est inutile puisque le trigger est défini en UPDATE uniquement sur la table: la fonction ne sera déclenchée que pour des UPDATE.

Il ne faut pas refaire d'UPDATE dans la fonction de trigger, puisqu'elle est deja déclenchée sur un update:
Il faut directement mettre a jour le record NEW pour la ou les colonnes concernées par l'update, par exemple:


Code:

CREATE OR REPLACE FUNCTION trig_id_obj_hab()
  RETURNS trigger AS
$BODY$

BEGIN

        NEW.id_obj=NEW.num_site || 'HAB' || NEW.id_hab;

END;
$BODY$

(a adapter en fonction des valeurs que vous voulez mettre dans id_obj: ca peut etre les valeurs de OLD, c'est a dire la ligne avant sa mise a jour.

Ce lien peut etre utile: http://www.postgresql.org/docs/current/ … igger.html

Pour débugger vos fonctions, la commande:

Code:

RAISE NOTICE 'mon texte a afficher';

est tres utile: vous pouvez y mettre des variables avec la syntaxe suivante:

Code:

RAISE NOTICE 'variable1: % - variable2: %', var1, var2;

Nicolas

Hors ligne

 

#3 Thu 15 September 2011 14:40

Roxane
Participant occasionnel
Date d'inscription: 9 Aug 2011
Messages: 15

Re: [Postgre/Postgis] Déclanchement trigger UPDATE

Merci Nicolas pour ces conseils.
J'ai recréé ma fonction trigger  comme suit:

CREATE OR REPLACE FUNCTION trig_id_obj_hab()
  RETURNS trigger AS
$BODY$
    BEGIN
     NEW.id_obj=NEW.num_site||'HAB'||NEW.id_hab;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION trig_id_obj_hab() OWNER TO postgres;

Cependant il ne met toujours pas à jour le champ id_obj pour les nouveaux objets créés dans QGIS.
Est-ce que le problème peut venir de QGIS?

Hors ligne

 

#4 Thu 15 September 2011 15:29

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [Postgre/Postgis] Déclanchement trigger UPDATE

Roxane a écrit:

Merci Nicolas pour ces conseils.
J'ai recréé ma fonction trigger  comme suit:

CREATE OR REPLACE FUNCTION trig_id_obj_hab()
  RETURNS trigger AS
$BODY$
    BEGIN
     NEW.id_obj=NEW.num_site||'HAB'||NEW.id_hab;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION trig_id_obj_hab() OWNER TO postgres;

Cependant il ne met toujours pas à jour le champ id_obj pour les nouveaux objets créés dans QGIS.
Est-ce que le problème peut venir de QGIS?


Non, peu de chances que ca vienne de QGis.
L'exemple donné dans mon message precedent était écrit sans tester:

Deux choses:
L'affectation de variables en plpgsql se fait avec l'operateur ":=" :

Code:

NEW.id_obj := NEW.num_site||'HAB'||NEW.id_hab;

Un trigger doit retourner une valeur, également. La fonction du trigger serait plutot:

Code:

CREATE OR REPLACE FUNCTION trig_id_obj_hab()
 RETURNS trigger AS
$BODY$
BEGIN
    NEW.id_obj := NEW.num_site||'HAB'||NEW.id_hab;
    RETURN NEW;
END;
$BODY$
 LANGUAGE 'plpgsql' VOLATILE

COST 100;

D'autre part, le trigger est défini "AFTER UPDATE", c'est a dire déclenché qd l'update est fait dans la table.
Il faut le définir "BEFORE UPDATE" pour que la nouvelle valeur soit reflétée dans la table:

Code:

CREATE TRIGGER maj_id_obj
 BEFORE UPDATE
 ON test
 FOR EACH ROW
 EXECUTE PROCEDURE trig_id_obj_hab();

.

Je ne saurais trop vous conseiller de tester ces fonctions et trigger en dehors de QGis dans un premier temps, en faisant des update manuels dans la table, puis de passer a Qgis lorsque le tout est validé.

Nicolas

Hors ligne

 

#5 Thu 15 September 2011 15:41

Roxane
Participant occasionnel
Date d'inscription: 9 Aug 2011
Messages: 15

Re: [Postgre/Postgis] Déclanchement trigger UPDATE

Merci encore!!
Je vais tester tout ça.

Hors ligne

 

#6 Thu 15 September 2011 16:16

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [Postgre/Postgis] Déclanchement trigger UPDATE

Roxane a écrit:

Merci encore!!
Je vais tester tout ça.


wink tongue

Hors ligne

 

#7 Fri 16 September 2011 10:40

Roxane
Participant occasionnel
Date d'inscription: 9 Aug 2011
Messages: 15

Re: [Postgre/Postgis] Déclanchement trigger UPDATE

Bonjour Nicolas,

Juste pour vous signaler que mon trigger fonctionne enfin grâce à vos corrections et à l'ajout de guillemets autour de RETURNS "trigger" AS.
Merci, bonne journée.
Roxane

Hors ligne

 

#8 Fri 16 September 2011 11:13

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: [Postgre/Postgis] Déclanchement trigger UPDATE

Roxane a écrit:

Bonjour Nicolas,

Juste pour vous signaler que mon trigger fonctionne enfin grâce à vos corrections et à l'ajout de guillemets autour de RETURNS "trigger" AS.
Merci, bonne journée.
Roxane


Oki, cool wink

Nicolaqs

Hors ligne

 

Pied de page des forums

Powered by FluxBB