In realtà non è la risposta, ma una breve spiegazione su come trovare la fonte dell'errore.
Per prima cosa troviamo il pgcrypto
estensione:
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Dovrebbe restituire qualcosa come:
╔════════════════════╤════════════╗
║ 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 ║
╚════════════════════╧════════════╝
Quindi il pgcrypto
installato nello schema nd
nel mio database.
Quindi guardiamo al search_path
parametro che fornisce le informazioni dove cercare gli oggetti DB:
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Significa che gli oggetti verranno ricercati nello schema con il nome dell'utente corrente e, se non viene trovato, nello schema public
.
Infine controlliamo l'utente corrente:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Quindi come puoi vedere l'estensione installata nello schema nd
non può essere trovato usando il search_path
che in realtà è postgres, public
e abbiamo ottenuto l'errore:
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.
Esistono diversi modi per risolverlo a seconda dei valori effettivi per il tuo DB menzionato sopra.
Puoi spostare l'estensione in un altro schema come:
alter extension pgcrypto set schema public;
Puoi modificare il search_path
opzione come:
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
Infine potresti specificare esplicitamente lo schema nell'istruzione SQL:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');