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.