Ce n'est pas la réponse en fait mais une brève explication comment trouver la source de l'erreur.
Tout d'abord, trouvons le pgcrypto
extension :
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Il devrait renvoyer quelque chose comme :
╔════════════════════╤════════════╗
║ extname │ nspname ║
╠════════════════════╪════════════╣
║ plpgsql │ pg_catalog ║
║ adminpack │ pg_catalog ║
║ plpythonu │ pg_catalog ║
║ pg_stat_statements │ public ║
║ plpython3u │ pg_catalog ║
║ hstore │ public ║
║ uuid-ossp │ public ║
║ pg_trgm │ public ║
║ ltree │ public ║
║ tablefunc │ public ║
║ unaccent │ public ║
║ pgcrypto │ nd ║
╚════════════════════╧════════════╝
Donc le pgcrypto
installé dans le schéma nd
dans ma base de données.
Ensuite, regardons le search_path
paramètre qui fournit les informations où rechercher les objets de la base de données :
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Cela signifie que les objets seront recherchés dans le schéma avec le nom de l'utilisateur courant et, si rien n'est trouvé, dans le schéma public
.
Enfin, vérifions l'utilisateur actuel :
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Donc comme vous pouvez voir l'extension installée dans le schéma nd
ne peut pas être trouvé en utilisant le search_path
qui est en fait postgres, public
et nous avons eu l'erreur :
select gen_salt('md5');
ERROR: function gen_salt(unknown) does not exist
LINE 1: select gen_salt('md5');
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Il existe plusieurs façons de résoudre ce problème en fonction des valeurs réelles de votre base de données mentionnées ci-dessus.
Vous pouvez déplacer l'extension vers un autre schéma comme :
alter extension pgcrypto set schema public;
Vous pouvez modifier le search_path
option comme :
set search_path to '"$user", public'; -- for the active session only
alter database your_db_name set search_path to '"$user", public'; -- permanently for the database
Enfin, vous pouvez spécifier explicitement le schéma dans l'instruction SQL :
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');