Hoogstwaarschijnlijk een kwestie van schema versus schema search_path . De functie is gemaakt in het standaardschema van de aanmakende gebruiker. Als dat niet in het search_path staat van de huidige gebruiker, is het niet zichtbaar.
Details:
Normaal gesproken maakt u openbare functies aan in het schema public en heb dat schema in ieders 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;
Schemakwalificatie is alleen nodig als public is sowieso niet het standaardschema.
Ook uw GRANT commando's hebben geen zin. De EXECUTE privilege voor functies wordt verleend aan public standaard. En zodra je aan public verleent, , is het niet nodig om andere gebruikers toe te kennen. Vooral niet om postgres , wat de OWNER . is hoe dan ook en ook nog een superuser. De handleiding:
U moet wel USAGE . toekennen op het SCHEMA waar de functie wordt gemaakt. De public schema verleent USAGE naar public (iedereen) standaard.
Casten naar integer verandert hier niets omdat een numerieke letterlijke zonder decimale punt automatisch tot integer wordt gedwongen. Details over constanten in de handleiding.