Vous n'êtes pas identifié(e).
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
Dernière modification par jpl (08/07/2015 12:24:49)
Hors ligne
Bonjour,
Aucune idée si un trigger peut désactiver un autre trigger sur une même table, mais ça me parait intuitivement une mauvaise idée de toutes façons. Quel problème cherchez vous à résoudre exactement ?
Julien.
https://rjuju.github.io/
Hors ligne
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
Hors ligne
Ok...
Peut-être que session_replication_role pourrait vous aider (voir http://docs.postgresql.fr/9.4/sql-altertable.html ).
Julien.
https://rjuju.github.io/
Hors ligne
Merci.
Je regarde la doc et vois ce que je peux faire.
Cordialement
JP
Hors ligne