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 15/06/2016 22:23:59

Tetra
Membre

[résolu] Fonction decode dans un trigger

Bonjour,

J'utilise une appli qui s'appuie sur une BDD dont une fonction trigger fait appel à la fonction decode.
Suivant la source de déclenchement du trigger, la fonction me retourne un résultat sous une forme différente sans que je sache expliquer pourquoi.

Pour mettre cela en évidence, j'ai modifié la fonction pour ajouter une ligne dans un table de log...le trigger ressemble à çà :

CREATE OR REPLACE FUNCTION update_utilisateur()
  RETURNS trigger AS
$BODY$declare
  (...)
  tempvar varchar(50);
BEGIN
  (...)
  select decode('Ym9uam91cg==','base64') INTO tempvar;
  insert into log (log) values (tempvar);
  (...)
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Lorsque je modifie un utilisateur via l'application (connectée en ODBC), je vois dans le log PostgreSQL la requête suivante :

UPDATE utilisateur SET nom_utilisateur = 'depuisapp' WHERE nom_utilisateur IS NULL AND id_utilisateur = 18 AND pwd IS NULL

Je joue ensuite via pgAdmin la requête suivante :

UPDATE ctx_02.utilisateur SET nom_utilisateur = 'depuispgadmin' WHERE nom_utilisateur = 'depuisapp'

Suite à çà, le requête select * from log me retourne
1 - "\x626f6e6a6f7572"
2 - "bonjour"

Je suppose qu'en 1 ça correspond à "bonjour" en hexa mais qu'est ce qui peut expliquer cette différence ?
Idéalement, je voudrais toujours avoir le résultat tel que 2.

Merci,

Dernière modification par Tetra (17/06/2016 20:52:01)

Hors ligne

#2 16/06/2016 08:47:10

Marc Cousin
Membre

Re : [résolu] Fonction decode dans un trigger

La table «log» est déclarée comment  (le type du champ log) ?

Et surtout, est-ce que vous pourriez voir ce que vaut bytea_output dans les deux cas (dans pgadmin et dans le driver odbc): exécutez show bytea_output, et affichez le résultat...


Marc.

Hors ligne

#3 17/06/2016 20:51:44

Tetra
Membre

Re : [résolu] Fonction decode dans un trigger

Merci Marc, vous aviez vu juste, c'est bien un problème de bytea_output.

En fait, je tente de faire fonctionner une appli conçue pour une version 8.2 sur une 9.4, cf. mon précédent post.
Or, le paramètre bytea_ouput est d'après ce que j'ai lu apparu en 9.
J'ai fixé le paramètre au niveau de la base (ALTER DATABASE mabase SET bytea_output='escape') et ainsi ça fonctionne.

Merci

Hors ligne

#4 17/06/2016 21:03:30

Marc Cousin
Membre

Re : [résolu] Fonction decode dans un trigger

OK. Vous auriez pu le forcer juste au niveau de la fonction trigger, au besoin (il suffit de le mettre dans sa déclaration)… bytea_output à hex est plus performant dans beaucoup de cas... c'est dommage de le forcer globalement si vous n'en avez pas besoin

Dernière modification par Marc Cousin (17/06/2016 21:03:57)


Marc.

Hors ligne

#5 01/08/2016 15:39:24

Tetra
Membre

Re : [résolu] Fonction decode dans un trigger

Merci pour ces précisions.

J'ai choisi d'appliquer le paramètre sur la base car comme je n'ai pas la maîtrise complète de l'ensemble des triggers je me dis que ça me permet d'approcher le plus possible le fonctionnement d'une version 8.2.
En toute logique, ce ne devrait pas affecter les performances des autres bases hébergées par le même moteur.

Hors ligne

Pied de page des forums