Provavelmente uma questão de esquema vs. esquema
search_path . A função é criada no esquema padrão do usuário criador. Se não estiver no search_path do usuário atual, não é visível. Detalhes:
Normalmente, você criaria funções públicas no esquema
public e ter esse esquema no search_path de todos . 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; A qualificação de esquema só é necessária se
public não é o esquema padrão de qualquer maneira. Além disso, seu
GRANT comandos não fazem sentido. O EXECUTE privilégio para funções é concedido a public por padrão. E assim que você conceder a public , não há necessidade de conceder a outros usuários. Especialmente para não postgres , que é o OWNER de qualquer maneira e um superusuário também. O manual:
Você precisa conceder
USAGE no SCHEMA onde a função é criada. O public esquema concede USAGE para public (todos) por padrão. Além 1
Transmitindo para
integer não muda nada aqui porque um literal numérico sem ponto decimal é forçado a inteiro automaticamente. Detalhes sobre constantes no manual.
Além 2
Considere urgentemente atualizar para uma versão atual do Postgres. Seu software está completamente desatualizado.