Het is eigenlijk niet het antwoord, maar een korte uitleg hoe u de bron van de fout kunt vinden.
Laten we eerst de pgcrypto
. vinden extensie:
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Het zou zoiets moeten retourneren als:
╔════════════════════╤════════════╗
║ 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 ║
╚════════════════════╧════════════╝
Dus de pgcrypto
geïnstalleerd in het schema nd
in de mijn database.
Laten we vervolgens kijken naar het search_path
parameter die de informatie geeft waar DB-objecten moeten worden gezocht:
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Dit betekent dat de objecten worden doorzocht in het schema met de naam van de huidige gebruiker en, als er niets wordt gevonden, in het schema public
.
Laten we tot slot de huidige gebruiker controleren:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Dus zoals je kunt zien, is de extensie geïnstalleerd in het schema nd
kan niet worden gevonden met behulp van het search_path
wat eigenlijk postgres, public
. is en we kregen de fout:
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.
Er zijn verschillende manieren om dit op te lossen, afhankelijk van de werkelijke waarden voor uw DB hierboven vermeld.
U kunt de extensie naar een ander schema verplaatsen zoals:
alter extension pgcrypto set schema public;
U kunt het search_path
. wijzigen optie zoals:
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
Ten slotte zou je het schema expliciet kunnen specificeren in de SQL-instructie:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');