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 17/02/2012 12:24:06

asphator
Membre

[Jasper + Procédure stockée] Comment faire un update?

Bonjour,

J'utilise JasperServer pour afficher des rapports.
Ces rapports sont développés sous iReport et ne peuvent se baser que sur une seule requête de type SELECT.

J'ai besoin de faire une mise à jour avant le SELECT (ex: last_consultation_date).
Pour tricher donc, j'ai la requête suivante :

SELECT * FROM func_update_report()

Jusque là, tout va bien.

Voici maintenant la procédure stockée :

CREATE OR REPLACE FUNCTION func_update_report() RETURNS SETOF data_report AS
$BODY$
DECLARE
    record data_report;
BEGIN
    UPDATE my_table SET last_consultation_date = now();

    FOR record IN SELECT * FROM my_table 
    LOOP
        RETURN NEXT record;
    END;
    RETURN;
END;
$BODY$
LANGUAGE 'plpgsql';

Le problème est le message d'erreur suivant lorsque la procédure stockée est appelée :

org.postgresql.util.PSQLException: ERREUR: ne peut pas exécuter UPDATE dans une transaction en lecture seule Où : instruction SQL « UPDATE my_table SET last_consultation_date = now() » PL/pgSQL function "func_update_report" line 5 at instruction SQL

C'est déjà bizarre en soit puisque par défaut, le mode de transaction devrait être à READ WRITE (j'ai vérifié le postgresql.conf également)...

M'enfin, admettons. Mais là encore, si jamais j'essaie de corriger en ajoutant un SET TRANSACTION READ WRITE; entre BEGIN et UPDATE, j'ai le message d'erreur suivant :

org.postgresql.util.PSQLException: ERREUR: le mode de transaction lecture/écriture doit être configuré avant d'exécuter la première requête Où : instruction SQL « SET TRANSACTION READ WRITE » PL/pgSQL function "func_update_report" line 5 at instruction SQL

que du coup, je ne cerne pas vraiment.

Auriez-vous une idée / explication / solution?

Merci d'avance.

Hors ligne

#2 17/02/2012 12:31:15

gleu
Administrateur

Re : [Jasper + Procédure stockée] Comment faire un update?

Avez-vous essayer d'exécuter vous-même votre requête ? autrement dit, sans passer par jasper.

Si non, et que ça ne passe pas, ne seriez-vous pas sur un esclave en lecture seule.

Si oui, et que ça passe, il est tout à fait possible que Jasper ouvre de lui-même une transaction en lecture seule... auquel cas vous ne pouvez rien faire, si ce n'est rien regarder dans le manuel de Jasper pour voir si une parade existe... bon courage dans ce cas.


Guillaume.

Hors ligne

#3 17/02/2012 12:31:42

Marc Cousin
Membre

Re : [Jasper + Procédure stockée] Comment faire un update?

À priori, ça doit être jasper reports qui passe la transaction en read only. C'est pas le genre de chose qui se fait tout seul… Ou bien l'utilisateur utilisé pour se connecter par jasper qui a un ALTER ROLE pour le passer en read only… ALTER role xxxx SET session CHARACTERISTICS AS TRANSACTION read only;


Marc.

Hors ligne

#4 17/02/2012 15:18:34

asphator
Membre

Re : [Jasper + Procédure stockée] Comment faire un update?

Déjà testé la requête sans passer par Jasper : cela fonctionne très bien.
Maintenant, cela n'explique pas pourquoi le SET TRANSACTION READ WRITE n'a pas d'effet, ni encore moins pourquoi elle entraîne une erreur.

J'ai vérifié le rôle de l'user en charge de l'exécution des requêtes par Jasper, j'ai testé avec :

GRANT ALL PRIVILEGES ON FUNCTION func_update_date() TO my_role;
ALTER ROLE my_role SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE;

Sans effet non plus...

Enfin, sous Oracle, il n'y a pas ce problème, donc selon moi, le soucis vient bien de la configuration de postgres quelque part...

Hors ligne

#5 17/02/2012 15:25:46

gleu
Administrateur

Re : [Jasper + Procédure stockée] Comment faire un update?

Maintenant, cela n'explique pas pourquoi le SET TRANSACTION READ WRITE n'a pas d'effet, ni encore moins pourquoi elle entraîne une erreur.

Si Jasper fait lui-même le BEGIN et configure la transaction en lecture seule, il n'est plus moyen de revenir en arrière. Cela expliquerait pourquoi votre SET TRANSACTION ne fonctionne pas (et vous renvoit l'erreur comme quoi "le mode de transaction lecture/écriture doit être configuré avant d'exécuter la première requête".

Enfin, sous Oracle, il n'y a pas ce problème, donc selon moi, le soucis vient bien de la configuration de postgres quelque part...

Argument très discutable. Vu l'erreur que vous recupérez, je suis prêt à parier que le problème vient de Jasper. Le plus simple est certainement de configurer la trace de toutes les requêtes pour savoir ce qui est exécuté avant votre procédure stockée. Je suis prêt à parier que Jasper exécute des requêtes avant.


Guillaume.

Hors ligne

#6 20/02/2012 10:54:01

asphator
Membre

Re : [Jasper + Procédure stockée] Comment faire un update?

Bonjour

Effectivement, vous avez raison. Il semblerait que Jasper ne fasse que des transactions read_only par défaut et qu'il faille passer en JNDI pour pouvoir modifier son comportement.
Je vais donc passer sous le forum de Jasper du coup ^^

Merci pour votre aide smile



ps: pour ceux qui seraient intéressés par la suite, voici le fil du discussion sur Jasper : http://jasperforge.org/plugins/espforum … icid=95700

Hors ligne

Pied de page des forums