Mysql
 sql >> Base de données >  >> RDS >> Mysql

Chiffrer le mot de passe dans l'instruction d'insertion dans postgresql génère une erreur (besoin d'ajouter un cast de type explicite)

Ce n'est pas la réponse en fait mais une brève explication comment trouver la source de l'erreur.

Tout d'abord, trouvons le pgcrypto extension :

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

Il devrait renvoyer quelque chose comme :

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

Donc le pgcrypto installé dans le schéma nd dans ma base de données.

Ensuite, regardons le search_path paramètre qui fournit les informations où rechercher les objets de la base de données :

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

Cela signifie que les objets seront recherchés dans le schéma avec le nom de l'utilisateur courant et, si rien n'est trouvé, dans le schéma public .

Enfin, vérifions l'utilisateur actuel :

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

Donc comme vous pouvez voir l'extension installée dans le schéma nd ne peut pas être trouvé en utilisant le search_path qui est en fait postgres, public et nous avons eu l'erreur :

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.

Il existe plusieurs façons de résoudre ce problème en fonction des valeurs réelles de votre base de données mentionnées ci-dessus.

Vous pouvez déplacer l'extension vers un autre schéma comme :

alter extension pgcrypto set schema public;

Vous pouvez modifier le search_path option comme :

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

Enfin, vous pouvez spécifier explicitement le schéma dans l'instruction SQL :

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