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

#1 23/06/2011 09:38:30

sbouchard
Membre

Type booléen - Surcharge d'opérateur

Bonjour,

Environnement :
PostgreSQL 9.0.4 sur WindowsServer2008
Client MS-Access 2007 lié à une base de données PostgreSQL

Le type booléen entre un client MS-Access (quelle que soit la version) et un serveur PostgreSQL pose problème.
MS-Access envoie à PostgreSQL -1 pour true et 0 pour false.
Lorsqu'une clause WHERE du client comporte une expression utilisant un champ de type booléen elle ne peut pas être évaluée par PostgreSQL.

Ce qui déclenche l’erreur suivante :

ERROR:  operator does not exist: boolean = integer

Pour résoudre ce problème nous avons surchargé l'opérateur d'égalité afin qu'il accepte ce type d'argument en créant un opérateur, qui lui appelle une fonction personnalisée pour effectuer la comparaison

create function prospicio_dvlp_demo.integer2boolean (boolean, integer) returns boolean as '
begin
        if $1 isnull then
               return null;
        end if;

        if $1 is true then
               if $2 <> 0 then
                       return true;
               end if;
        else
               if $2 = 0 then
                       return true;
               end if;
        end if;
        
        return false;
end;
' language 'plpgsql';


create operator prospicio_dvlp_demo.= (
        leftarg = boolean,
        rightarg = integer,
        procedure = integer2boolean,
        commutator = '=',
        negator = '<>',
        restrict = eqsel,
        join = eqjoinsel
);

Le problème :
- L'opérateur et la fonction se trouvent dans un schéma nommé, autre que public.
- Le chemin de recherche des objets de base de données  est le schéma de même nom que l'utilisateur connecté et pg_catalog.
- Les utilisateurs ne sont pas propriétaire du schéma contenant l'opérateur surchargé, donc, celui-ci n'est pas trouvé.
- Il n’est semble-t-il pas possible de donner des droits sur l’opérateur créé, malgré que cet opérateur soit un objet. De toute manière, cela ne résoudrait pas nécessairement le problème.

A votre avis y a-t-il moyen de faire en sorte que cet opérateur soit "trouvé" sans le mettre dans le schéma public de la base de données?

D'avance merci pour vos conseils.

Sylvie

Hors ligne

#2 24/06/2011 09:56:00

gleu
Administrateur

Re : Type booléen - Surcharge d'opérateur

Cela ne fonctionnera qu'avec un superutilisateur. Les utilisateurs standards sont protégés contre ça.


Guillaume.

Hors ligne

Pied de page des forums