Es ist nicht die eigentliche Antwort, sondern eine kurze Erklärung, wie man die Fehlerquelle findet.
Lassen Sie uns zuerst den pgcrypto
finden Erweiterung:
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Es sollte etwas zurückgeben wie:
╔════════════════════╤════════════╗
║ 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 ║
╚════════════════════╧════════════╝
Also das pgcrypto
im Schema nd
installiert in meiner Datenbank.
Als nächstes schauen wir uns den search_path
an Parameter, die angeben, wo DB-Objekte gesucht werden sollen:
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Das bedeutet, dass die Objekte im Schema mit dem Namen des aktuellen Benutzers und, wenn nichts gefunden wird, im Schema public
gesucht werden .
Lassen Sie uns abschließend den aktuellen Benutzer überprüfen:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Wie Sie sehen können, ist die Erweiterung im Schema nd
installiert kann mit search_path
nicht gefunden werden was eigentlich postgres, public
ist und wir haben den Fehler:
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.
Abhängig von den oben genannten tatsächlichen Werten für Ihre Datenbank gibt es mehrere Möglichkeiten, das Problem zu beheben.
Sie können die Erweiterung wie folgt in ein anderes Schema verschieben:
alter extension pgcrypto set schema public;
Sie können den search_path
ändern Option wie:
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
Schließlich könnten Sie das Schema explizit in der SQL-Anweisung angeben:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');