Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verschlüsselung des Passworts in der Einfügeanweisung in Postgresql löst einen Fehler aus (Explizite Typumwandlung muss hinzugefügt werden)

Es ist nicht die eigentliche Antwort, sondern eine kurze Erklärung, wie man die Fehlerquelle findet.

Lassen Sie uns zuerst den pgcrypto finden Erweiterung:

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

Es sollte etwas zurückgeben wie:

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

Also das pgcrypto im Schema nd installiert in meiner Datenbank.

Als nächstes schauen wir uns den search_path an Parameter, die angeben, wo DB-Objekte gesucht werden sollen:

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

Das bedeutet, dass die Objekte im Schema mit dem Namen des aktuellen Benutzers und, wenn nichts gefunden wird, im Schema public gesucht werden .

Lassen Sie uns abschließend den aktuellen Benutzer überprüfen:

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

Wie Sie sehen können, ist die Erweiterung im Schema nd installiert kann mit search_path nicht gefunden werden was eigentlich postgres, public ist und wir haben den Fehler:

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.

Abhängig von den oben genannten tatsächlichen Werten für Ihre Datenbank gibt es mehrere Möglichkeiten, das Problem zu beheben.

Sie können die Erweiterung wie folgt in ein anderes Schema verschieben:

alter extension pgcrypto set schema public;

Sie können den search_path ändern Option wie:

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

Schließlich könnten Sie das Schema explizit in der SQL-Anweisung angeben:

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