Na verdade, não é a resposta, mas uma breve explicação de como encontrar a fonte do erro.
Primeiro vamos encontrar o
pgcrypto
extensão:select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
Deve retornar algo como:
╔════════════════════╤════════════╗
║ 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 ║
╚════════════════════╧════════════╝
Portanto, o
pgcrypto
instalado no esquema nd
no meu banco de dados. Em seguida, vamos olhar para o
search_path
parâmetro que fornece as informações onde pesquisar objetos de banco de dados:show search_path;
╔═════════════════╗
║ search_path ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝
Significa que os objetos serão pesquisados no esquema com o nome do usuário atual e, se nada for encontrado, no esquema
public
. Finalmente vamos verificar o usuário atual:
select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres ║
╚══════════════╝
Então, como você pode ver a extensão instalada no esquema
nd
não pode ser encontrado usando o search_path
que na verdade é postgres, public
e recebemos o erro: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.
Existem várias maneiras de corrigi-lo, dependendo dos valores reais do seu banco de dados mencionados acima.
Você pode mover a extensão para outro esquema como:
alter extension pgcrypto set schema public;
Você pode alterar o
search_path
opção como: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
Finalmente, você pode especificar explicitamente o esquema na instrução SQL:
select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');