Vous n'êtes pas identifié(e).
Pages : 1
Merci.
Je regarde la doc et vois ce que je peux faire.
Cordialement
JP
J'ai une table A sur un serveur A alimentée par un trigger positionné sur un serveur B avec des bases que je n'administre pas.
Lorsque les utilisateurs métier sur B créent un nouvel objet, alors ma table A est implémentée.
D'où un premier trigger INSERT qui va balancer un certain nombre d'update sur cette même table A (par exemple je récupère la géométrie de mon nouvel objet et je l'affecte à tous les dossiers qui ont le même numéro).
J'ai un deuxième trigger UPDATE qui permet de prendre en compte les modifications apportées par mes utilisateurs métier et d'impacter tous les objets ayant le même numéro de dossier ( exemple je modifie la géométrie d'un objet et j'applique cette modification à tous les dossiers ayant le même numéro). Mais je ne souhaite pas qu'il se déclenche lorsque j'effectue un update à partir de mon trigger INSERT, d'où la tentative de désactivation du trigger UPDATE
JP
Bonjour.
J'ai un trigger en INSERT qui doit, entre autre, désactiver un autre trigger en UPDATE en début d'exécution et le réactiver en fin.
Les deux triggers sont rattachés à le même table.
Sauf que lorsque je lance une requête INSERT j'ai le message suivant :
ERROR: cannot ALTER TABLE "sig_conformite" because it is being used by active queries in this session
CONTEXT: SQL statement "Alter table sig_conformite disable trigger t_conformite_up_alerte"
PL/pgSQL function "conformite_insert" line 7 at SQL statement
Pour le besoin j'ai simplifié au maximum les triggers :
CREATE OR REPLACE FUNCTION conformite_insert()
RETURNS trigger AS
$BODY$DECLARE
BEGIN
Alter table sig_conformite disable trigger t_conformite_up_alerte;
return NEW;
END;$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION conformite_insert()
OWNER TO postgres;
CREATE TRIGGER t_conformite_insert
BEFORE INSERT
ON sig_conformite
FOR EACH ROW
EXECUTE PROCEDURE conformite_insert();
Le trigger update se contente de renseigner un variable et de me retourner l'info avec un raise notice.
Il semble donc qu'un trigger sur une table ne puisse en désactiver un autre sur la même table quand bien même les fonctions INSERT et UPDATE sont bien distinguées . Quelqu'un peut-il me le confirmer ?
L'option qu'il me reste est l'utilisation des variables TG_OP
Cordialement
JP
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
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();
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
Pages : 1