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

Crittografa la password nell'istruzione di inserimento in postgresql genera un errore (è necessario aggiungere un cast di tipo esplicito)

In realtà non è la risposta, ma una breve spiegazione su come trovare la fonte dell'errore.

Per prima cosa troviamo il pgcrypto estensione:

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

Dovrebbe restituire qualcosa come:

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

Quindi il pgcrypto installato nello schema nd nel mio database.

Quindi guardiamo al search_path parametro che fornisce le informazioni dove cercare gli oggetti DB:

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

Significa che gli oggetti verranno ricercati nello schema con il nome dell'utente corrente e, se non viene trovato, nello schema public .

Infine controlliamo l'utente corrente:

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

Quindi come puoi vedere l'estensione installata nello schema nd non può essere trovato usando il search_path che in realtà è postgres, public e abbiamo ottenuto l'errore:

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.

Esistono diversi modi per risolverlo a seconda dei valori effettivi per il tuo DB menzionato sopra.

Puoi spostare l'estensione in un altro schema come:

alter extension pgcrypto set schema public;

Puoi modificare il search_path opzione come:

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

Infine potresti specificare esplicitamente lo schema nell'istruzione SQL:

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