Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 06/07/2015 11:52:21
- jpl
- Membre
Trigger postgresql : valeur NEW qui ne remonte pas
Bonjour.
J'ai un souci avec un trigger.
Celui-ci se déclenche sur un update de champs nommés 'the_geom' ou 'libelle'.
Lorsque je lance un update avec la valeur de libelle = 'Conforme' , le trigger se déclenche bien, fait ce qu'il faut, mais par contre le NEW.libelle n'est pas remontée dans ma base, la valeur du champ reste en l'état (avec l'ancienne valeur).
CREATE TRIGGER t_test_trigger
BEFORE UPDATE OF the_geom, libelle
ON sig_conformite
FOR EACH ROW
EXECUTE PROCEDURE test_trigger();
....
BEGIN
nb_dossier = 0;
nb_dossier = count(nom_dossier)from sig_conformite where nom_dossier = NEW.nom_dossier;
IF NEW.libelle = 'Conforme' THEN
NEW.alerte_date = 1;
raise notice 'nb dossiers :%', nb_dossier;
IF nb_dossier > 1 THEN
update sig_conformite set alerte_date = 1 where nom_dossier = NEW.nom_dossier;
END IF;
END IF;
return NEW;
....
En simplifiant le trigger je me suis rendu compte que c'est la ligne update sig_conformite set alerte_date = 1 where nom_dossier = NEW.nom_dossier qui met le bazar.
Je ne comprend pas pourquoi. J'ai supprimé tous les autres trigger (en cas d'interaction) mais le phénomène perdure. Quand je fais un raise notice sur NEW.libelle la valeur est bien 'Conforme', mais en final dans ma table, elle reste à 'Non conforme'.
Si quelqu'un à une idée sur la source du problème je suis preneur.
Cordialement
JP
Hors ligne
#2 06/07/2015 12:05:29
- gleu
- Administrateur
Re : Trigger postgresql : valeur NEW qui ne remonte pas
A priori, vous ne voulez pas faire cet UPDATE mais ceci :
NEW.alerte_date := 1;
Si ce n'est pas le cas, merci de fournir un exemple complet (ordre de création de table et de procédure stockée, ainsi que la requête d'UPDATE déclenchant le trigger).
Guillaume.
Hors ligne
#3 06/07/2015 12:29:22
- jpl
- Membre
Re : Trigger postgresql : valeur NEW qui ne remonte pas
En fait j'ai une table dans laquelle je peux trouver plusieurs fois le même numéro de dossier.
Lorsque je fais une modification sur l'attribut the_geom ou libelle, je veux que tous les dossiers ayant le même numéro soient impactés, d'où mon NEW.alerte = 1 et le test if avec l'update ... alerte_date = 1.
exemple : j'ai un objet avec un identifiant 3121, un libelle de type 'Non conforme',une valeur à 0 dans l'attribut alerte date. Un deuxième dossier a le même numéro (nom_dossier). Je veux que les deux dossier aient une valeur alerte_date égale à 1 lorsque le 3121 bascule en conforme
update sig_conformite set libelle = 'Conforme' where ogc_fid = 3121;
Et c'est le cas ! Sauf qu'après l'update, le libelle du 3121 reste à 'Non conforme'
Procédure de création de la table :
CREATE TABLE sig_conformite
(
ogc_fid serial NOT NULL,
id_conformite_travaux integer,
id_travaux integer,
date_convocation date,
date_visite date,
date_conformite date,
observation text,
nom_prenom character varying(75),
libelle character varying(50),
nom_dossier character varying(25),
x double precision,
y double precision,
emplacement character varying(20),
the_geom geometry,
creation boolean, -- Attribut utilisé par le trigger conformite_up_geom
code_insee integer,
alerte_date integer DEFAULT 0, -- Attribut permettant de remonter les problèmes de date de conformié :...
alerte_geom integer DEFAULT 0, -- Attribut permettant de remonter l'absence de géométrie dans les alertes...
CONSTRAINT sig_conformite_pkey PRIMARY KEY (ogc_fid ),
CONSTRAINT enforce_dims_wkb_geometry CHECK (st_ndims(the_geom) = 2),
CONSTRAINT enforce_geotype_wkb_geometry CHECK (geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL),
CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 3944)
)
WITH (
OIDS=FALSE
);
ALTER TABLE sig_conformite
OWNER TO postgres;
COMMENT ON COLUMN sig_conformite.creation IS 'Attribut utilisé par le trigger conformite_up_geom';
COMMENT ON COLUMN sig_conformite.alerte_date IS 'Attribut permettant de remonter les problèmes de date de conformié :
0 => on remonrte l''alerte
1 => l''alerte n''est pas remontée';
COMMENT ON COLUMN sig_conformite.alerte_geom IS 'Attribut permettant de remonter l''absence de géométrie dans les alertes
0 => on remonrte l''alerte
1 => une géométrie existe ou impossible d''en affecter une';
CREATE INDEX sig_conformite_code_insee_idx
ON sig_conformite
USING btree
(code_insee );
CREATE INDEX sig_conformite_libelle_idx
ON sig_conformite
USING btree
(libelle COLLATE pg_catalog."default" );
CREATE INDEX sig_conformite_nom_dossier_idx
ON sig_conformite
USING btree
(nom_dossier COLLATE pg_catalog."default" );
CREATE INDEX sig_conformite_ogc_fid_idx
ON sig_conformite
USING btree
(ogc_fid );
CREATE INDEX sig_conformite_t1_geom_idx
ON sig_conformite
USING gist
(the_geom );
CREATE TRIGGER t_test_trigger
BEFORE UPDATE OF the_geom, libelle
ON sig_conformite
FOR EACH ROW
EXECUTE PROCEDURE test_trigger();
Hors ligne
#4 07/07/2015 09:16:44
- jpl
- Membre
Re : Trigger postgresql : valeur NEW qui ne remonte pas
Bonjour.
Pour info j'ai appliqué un trigger similaire sur une table prise au hasard dans ma base de test et j'ai le même résultat.
Cordialement
JP
Hors ligne