PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : PL/pgSQL » TRIGGER : Erreur "... being used by active queries in this session" » 08/07/2015 15:31:52

jpl

Merci.
Je regarde la doc et vois ce que je peux faire.
Cordialement
JP

#2 Re : PL/pgSQL » TRIGGER : Erreur "... being used by active queries in this session" » 08/07/2015 14:54:06

jpl

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

#3 PL/pgSQL » TRIGGER : Erreur "... being used by active queries in this session" » 08/07/2015 12:13:44

jpl
Réponses : 4

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

#4 Re : PL/pgSQL » Trigger postgresql : valeur NEW qui ne remonte pas » 07/07/2015 09:16:44

jpl

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

#5 Re : PL/pgSQL » Trigger postgresql : valeur NEW qui ne remonte pas » 06/07/2015 12:29:22

jpl

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();

#6 PL/pgSQL » Trigger postgresql : valeur NEW qui ne remonte pas » 06/07/2015 11:52:21

jpl
Réponses : 3

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

Pied de page des forums

Propulsé par FluxBB