Molto probabilmente una questione di schema vs. schema search_path . La funzione viene creata nello schema predefinito dell'utente che la crea. Se non è nel search_path dell'utente corrente, non è visibile.
Dettagli:
In genere, creeresti funzioni pubbliche nello schema public e avere quello schema nel search_path di tutti .
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 qualificazione dello schema è necessaria solo se public comunque non è lo schema predefinito.
Inoltre, il tuo GRANT i comandi non hanno senso. Il EXECUTE il privilegio per le funzioni è concesso a public per impostazione predefinita. E una volta che concedi a public , non è necessario concedere ad altri utenti. Soprattutto non per postgres , che è il OWNER comunque e anche un superutente. Il manuale:
Devi concedere USAGE sullo SCHEMA dove viene creata la funzione. Il public lo schema concede USAGE a public (tutti) per impostazione predefinita.
Trasmetti a integer non cambia nulla qui perché un valore letterale numerico senza punto decimale viene forzato automaticamente a un intero. Dettagli sulle costanti nel manuale.