Det är faktiskt inte svaret utan en kort förklaring hur man hittar källan till felet.
Låt oss först och främst hitta pgcrypto
tillägg:
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Det bör returnera något i stil med:
╔════════════════════╤════════════╗
║ 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 ║
╚════════════════════╧════════════╝
Alltså pgcrypto
installerat i schemat nd
i min databas.
Låt oss sedan titta på search_path
parameter som ger information om var DB-objekt ska sökas:
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Det betyder att objekten kommer att sökas i schemat med namnet på den aktuella användaren och, om inget hittas, i schemat public
.
Låt oss slutligen kontrollera den aktuella användaren:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Så som du kan se tillägget installerat i schemat nd
kan inte hittas med search_path
som faktiskt är postgres, public
och vi fick felet:
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.
Det finns flera sätt att fixa det beroende på de faktiska värdena för din DB som nämns ovan.
Du kan flytta tillägget till ett annat schema som:
alter extension pgcrypto set schema public;
Du kan ändra search_path
alternativ 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
Slutligen kan du explicit specificera schemat i SQL-satsen:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');