sql >> Databasteknik >  >> RDS >> Mysql

Kryptera lösenord i insert-satsen i postgresql ger ett fel (måste lägga till explicit typ cast)

Det är faktiskt inte svaret utan en kort förklaring hur man hittar källan till felet.

Låt oss först och främst hitta pgcrypto tillägg:

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

Det bör returnera något i stil med:

╔════════════════════╤════════════╗
║      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         ║
╚════════════════════╧════════════╝

Alltså pgcrypto installerat i schemat nd i min databas.

Låt oss sedan titta på search_path parameter som ger information om var DB-objekt ska sökas:

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

Det betyder att objekten kommer att sökas i schemat med namnet på den aktuella användaren och, om inget hittas, i schemat public .

Låt oss slutligen kontrollera den aktuella användaren:

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

Så som du kan se tillägget installerat i schemat nd kan inte hittas med search_path som faktiskt är postgres, public och vi fick felet:

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.

Det finns flera sätt att fixa det beroende på de faktiska värdena för din DB som nämns ovan.

Du kan flytta tillägget till ett annat schema som:

alter extension pgcrypto set schema public;

Du kan ändra search_path alternativ 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

Slutligen kan du explicit specificera schemat i SQL-satsen:

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



  1. Hur tar man backup av en enda tabell i en MySQL-databas?

  2. Bucketizing datum och tid data

  3. PDO - Fatalt fel:Anrop till en medlemsfunktion fetch() på ett icke-objekt

  4. MySQL ställer in secure-file-priv till flera kataloger