sql >> Database teknologi >  >> RDS >> Mysql

Krypter adgangskode i insert statement i postgresql kaster en fejl (Behov for at tilføje eksplicit type cast)

Det er faktisk ikke svaret, men en kort forklaring på, hvordan man finder kilden til fejlen.

Lad os først og fremmest finde pgcrypto udvidelse:

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

Det skulle returnere noget som:

╔════════════════════╤════════════╗ ║ 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 installeret i skemaet nd i min database.

Lad os derefter se på search_path parameter, der giver information om, hvor der skal søges i DB-objekter:

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

Det betyder, at objekterne søges i skemaet med navnet på den aktuelle bruger og, hvis der ikke findes noget, i skemaet public .

Lad os endelig tjekke den aktuelle bruger:

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

Så som du kan se udvidelsen installeret i skemaet nd kan ikke findes ved hjælp af search_path som faktisk er postgres, public og vi fik fejlen:

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.
 

Der er flere måder at løse det på, afhængigt af de faktiske værdier for din DB nævnt ovenfor.

Du kan flytte udvidelsen til et andet skema som:

alter extension pgcrypto set schema public;
 

Du kan ændre search_path mulighed som:

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
 

Endelig kunne du udtrykkeligt specificere skemaet i SQL-sætningen:

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



  1. Forudbygget Oracle-database til læring og test ved hjælp af Oracle Developer VM

  2. En anden mysqld-server, der kører på port 3306-fejl

  3. Sådan rettes "EXECUTE-sætningen mislykkedes, fordi dens WITH RESULT SETS-klausul specificerede 1 resultatsæt(er)..." i SQL Server

  4. MySQL TILFØJ KOLONNE