sql >> Base de Datos >  >> RDS >> Mysql

Cifrar la contraseña en la declaración de inserción en postgresql genera un error (es necesario agregar una conversión de tipo explícita)

En realidad, no es la respuesta, sino una breve explicación sobre cómo encontrar el origen del error.

En primer lugar, busquemos el pgcrypto extensión:

select e.extname, n.nspname
from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;

Debería devolver 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         ║
╚════════════════════╧════════════╝

Entonces el pgcrypto instalado en el esquema nd en mi base de datos.

A continuación, echemos un vistazo a search_path parámetro que proporciona la información sobre dónde buscar objetos DB:

show search_path;
╔═════════════════╗
║   search_path   ║
╠═════════════════╣
║ "$user", public ║
╚═════════════════╝

Significa que los objetos se buscarán en el esquema con el nombre del usuario actual y, si no se encuentra nada, en el esquema public .

Finalmente, comprobemos el usuario actual:

select current_user;
╔══════════════╗
║ current_user ║
╠══════════════╣
║ postgres     ║
╚══════════════╝

Entonces, como puede ver la extensión instalada en el esquema nd no se puede encontrar usando search_path que en realidad es postgres, public y obtuvimos el error:

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.

Hay varias formas de solucionarlo según los valores reales de su base de datos mencionados anteriormente.

Puede mover la extensión a otro esquema como:

alter extension pgcrypto set schema public;

Puede cambiar la search_path opción 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, podría especificar explícitamente el esquema en la instrucción SQL:

select schema_where_it_installed.gen_salt('md5');
-- For my example:
select nd.gen_salt('md5');