#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
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
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
Merci encore!!
Je vais tester tout ça.
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
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
Nicolaqs
Hors ligne