Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Criptografar a senha na instrução insert no postgresql gera um erro (é necessário adicionar conversão de tipo explícito)


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');