これは実際の答えではなく、エラーの原因を見つける方法の簡単な説明です。
まず、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');