Det er faktisk ikke svaret, men en kort forklaring på, hvordan man finder kilden til fejlen.
Lad os først og fremmest finde pgcrypto
udvidelse:
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Det skulle returnere noget som:
╔════════════════════╤════════════╗
║ 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 ║
╚════════════════════╧════════════╝
Så pgcrypto
installeret i skemaet nd
i min database.
Lad os derefter se på search_path
parameter, der giver information om, hvor der skal søges i DB-objekter:
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Det betyder, at objekterne søges i skemaet med navnet på den aktuelle bruger og, hvis der ikke findes noget, i skemaet public
.
Lad os endelig tjekke den aktuelle bruger:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Så som du kan se udvidelsen installeret i skemaet nd
kan ikke findes ved hjælp af search_path
som faktisk er postgres, public
og vi fik fejlen:
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.
Der er flere måder at løse det på, afhængigt af de faktiske værdier for din DB nævnt ovenfor.
Du kan flytte udvidelsen til et andet skema som:
alter extension pgcrypto set schema public;
Du kan ændre search_path
mulighed som:
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
Endelig kunne du udtrykkeligt specificere skemaet i SQL-sætningen:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');