Това всъщност не е отговорът, а кратко обяснение как да намерите източника на грешката.
Първо нека намерим pgcrypto
разширение:
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Трябва да върне нещо като:
╔════════════════════╤════════════╗
║ 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 ║
╚════════════════════╧════════════╝
Така че pgcrypto
инсталиран в схемата nd
в моята база данни.
След това нека разгледаме search_path
параметър, който предоставя информацията къде да търсите DB обекти:
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Това означава, че обектите ще бъдат търсени в схемата с името на текущия потребител и, ако нищо не бъде намерено, в схемата public
.
Накрая нека проверим текущия потребител:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Както можете да видите разширението, инсталирано в схемата nd
не може да бъде намерен с помощта на search_path
което всъщност е postgres, public
и получихме грешката:
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.
Има няколко начина как да го коригирате в зависимост от действителните стойности за вашата DB, споменати по-горе.
Можете да преместите разширението в друга схема като:
alter extension pgcrypto set schema public;
Можете да промените search_path
опция като:
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
Накрая можете да посочите изрично схемата в SQL израза:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');