Bonjour,
Je travail actuellement sur une table dans postgres qui contient plus de 66000 lignes.
Lors de la modification d'un des enregistrements, je voudrais qu'une procédure stockée se déclenche.
condition :
Si UPDATE ou INSERT de façon général :
=> insert ou update de la date de mise à jour dans le champs "date_modif" (timestamp)
SI UPDATE OU INSERT du champ "Libellé NA"
=> Mise à jour du "NAF réel" sur une requête imbriqué
SI UPDATE OU INSERT du champ the_geom
=> Mise à jour des champs "[G] Longitu" et "[G] Latitu"
si j'optimise mes procédures en 2 triggers en ajoutant la modification de date du jour , j'obtient :
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 BEGIN IF NEW.the_geom <> OLD.the_geom THEN UPDATE fc2009 SET "[G] Longit"=x(the_geom),"[G] Latitu"=y(the_geom) WHERE NEW.the_geom <> OLD.the_geom; END IF; NEW.date_modif := current_timestamp; RETURN NEW; END; CREATE TRIGGER recalcul_xy AFTER INSERT OR UPDATE ON fc2009 FOR EACH ROW EXECUTE PROCEDURE update_xy();
Il s'avère que la modification de la date de mise à jour ne se déclenche pas..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 BEGIN IF new."Libellé AP" <> old."Libellé AP" THEN UPDATE fc2009 SET "NAF réel"=(SELECT naffc2009."NAF" FROM naffc2009 WHERE fc2009."Libellé AP"=naffc2009."LibNAF") WHERE fc2009."NAF réel" is null OR new."Libellé AP" <> old."Libellé AP"; END IF; NEW.date_modif := current_timestamp; RETURN NEW; END; CREATE TRIGGER trig_update_naf AFTER INSERT OR UPDATE ON fc2009 FOR EACH ROW EXECUTE PROCEDURE insertnaf();
En gros, si je mets BEFORE, il me modifie toute la table ! si je mets AFTER, il me modifie rien..
du coup je reste sur BEFORE et j'essaie de contraindre postgres à déclencher la procédure seulement sur les champs qui ont fait l'objet d'un UPDATE ou INSERT.
pour cela j'ai testé la condition WHEN ou alors FOR UPDATE mais rien n'ets concluant..
Bref si vous pouviez m'aiguiller sur la bonne démarche à suivre..
merci d'avance
ampex
Partager