Najprawdopodobniej kwestia schematu a schematu search_path . Funkcja jest tworzona w domyślnym schemacie użytkownika tworzącego. Jeśli nie ma tego w search_path bieżącego użytkownika, nie jest widoczny.
Szczegóły:
Zazwyczaj tworzysz funkcje publiczne w schemacie public i mieć ten schemat w każdej search_path .
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;
Kwalifikacja schematu jest potrzebna tylko wtedy, gdy public i tak nie jest domyślnym schematem.
Również Twój GRANT polecenia nie mają sensu. EXECUTE uprawnienia do funkcji są przyznawane public domyślnie. A kiedy przyznasz do public , nie ma potrzeby przyznawania uprawnień innym użytkownikom. Szczególnie nie do postgres , czyli OWNER w każdym razie i superużytkownika. Podręcznik:
Musisz przyznać USAGE na SCHEMA gdzie tworzona jest funkcja. public schemat przyznaje USAGE do public (wszyscy) domyślnie.
Rzutowanie na integer nie zmienia niczego tutaj, ponieważ literał numeryczny bez kropki dziesiętnej jest automatycznie przekształcany w liczbę całkowitą. Szczegóły dotyczące stałych w podręczniku.