Très probablement une question de schéma par rapport au schéma search_path . La fonction est créée dans le schéma par défaut de l'utilisateur créateur. Si ce n'est pas dans le search_path de l'utilisateur actuel, il n'est pas visible.
Détails :
Typiquement, vous créeriez des fonctions publiques dans le schéma public et avoir ce schéma dans le search_path de tout le monde .
CREATE OR REPLACE FUNCTION public.fun_validatepost(integer, integer)
RETURNS integer AS
$BODY$
...
$BODY$ LANGUAGE plpgsql;
ALTER FUNCTION public.fun_validatepost(integer, integer) OWNER TO postgres;
La qualification de schéma n'est nécessaire que si public n'est de toute façon pas le schéma par défaut.
Aussi, votre GRANT les commandes n'ont aucun sens. Le EXECUTE le privilège pour les fonctions est accordé à public par défaut. Et une fois que vous accordez à public , il n'est pas nécessaire d'accorder aux autres utilisateurs. Surtout pas pour postgres , qui est le OWNER de toute façon et un superutilisateur, aussi. Le manuel :
Vous devez accorder USAGE sur le SCHEMA où la fonction est créée. Le public le schéma accorde USAGE à public (tout le monde) par défaut.
Conversion en integer ne change rien ici car un littéral numérique sans point décimal est automatiquement converti en entier. Détails sur les constantes dans le manuel.