PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

État SQL :42883, aucune fonction ne correspond au nom et aux types d'argument donnés. Mais cette fonction existe réellement

Très probablement une question de schéma par rapport au schéma search_path . La fonction est créée dans le schéma par défaut de l'utilisateur créateur. Si ce n'est pas dans le search_path de l'utilisateur actuel, il n'est pas visible.

Détails :

Typiquement, vous créeriez des fonctions publiques dans le schéma public et avoir ce schéma dans le search_path de tout le monde .

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 qualification de schéma n'est nécessaire que si public n'est de toute façon pas le schéma par défaut.

Aussi, votre GRANT les commandes n'ont aucun sens. Le EXECUTE le privilège pour les fonctions est accordé à public par défaut. Et une fois que vous accordez à public , il n'est pas nécessaire d'accorder aux autres utilisateurs. Surtout pas pour postgres , qui est le OWNER de toute façon et un superutilisateur, aussi. Le manuel :

Vous devez accorder USAGE sur le SCHEMA où la fonction est créée. Le public le schéma accorde USAGE à public (tout le monde) par défaut.

A part 1

Conversion en integer ne change rien ici car un littéral numérique sans point décimal est automatiquement converti en entier. Détails sur les constantes dans le manuel.

A part 2

Envisagez de toute urgence la mise à jour vers une version actuelle de Postgres. Votre logiciel est complètement obsolète.