Ini bukan jawaban sebenarnya tapi penjelasan singkat bagaimana menemukan sumber kesalahan.
Pertama-tama mari kita temukan pgcrypto
ekstensi:
select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Seharusnya mengembalikan sesuatu seperti:
╔════════════════════╤════════════╗
║ 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 ║
╚════════════════════╧════════════╝
Jadi pgcrypto
dipasang di skema nd
di database saya.
Selanjutnya mari kita lihat ke search_path
parameter yang memberikan informasi tempat mencari objek DB:
show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Ini berarti bahwa objek akan dicari dalam skema dengan nama pengguna saat ini dan, jika tidak ditemukan, dalam skema public
.
Akhirnya mari kita periksa pengguna saat ini:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Jadi seperti yang Anda lihat ekstensi dipasang di skema nd
tidak dapat ditemukan menggunakan search_path
yang sebenarnya adalah postgres, public
dan kami mendapatkan kesalahan:
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.
Ada beberapa cara untuk memperbaikinya tergantung dari nilai sebenarnya untuk DB Anda yang disebutkan di atas.
Anda dapat memindahkan ekstensi ke skema lain seperti:
alter extension pgcrypto set schema public;
Anda dapat mengubah search_path
pilihan seperti:
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
Akhirnya Anda dapat secara eksplisit menentukan skema dalam pernyataan SQL:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');