sql >> Database >  >> RDS >> Mysql

Versleutel wachtwoord in insert-instructie in postgresql geeft een fout (noodzaak om expliciete typecast toe te voegen)

Het is eigenlijk niet het antwoord, maar een korte uitleg hoe u de bron van de fout kunt vinden.

Laten we eerst de pgcrypto . vinden extensie:

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

Het zou zoiets moeten retourneren als:

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

Dus de pgcrypto geïnstalleerd in het schema nd in de mijn database.

Laten we vervolgens kijken naar het search_path parameter die de informatie geeft waar DB-objecten moeten worden gezocht:

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

Dit betekent dat de objecten worden doorzocht in het schema met de naam van de huidige gebruiker en, als er niets wordt gevonden, in het schema public .

Laten we tot slot de huidige gebruiker controleren:

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

Dus zoals je kunt zien, is de extensie geïnstalleerd in het schema nd kan niet worden gevonden met behulp van het search_path wat eigenlijk postgres, public . is en we kregen de fout:

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.

Er zijn verschillende manieren om dit op te lossen, afhankelijk van de werkelijke waarden voor uw DB hierboven vermeld.

U kunt de extensie naar een ander schema verplaatsen zoals:

alter extension pgcrypto set schema public;

U kunt het search_path . wijzigen optie zoals:

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

Ten slotte zou je het schema expliciet kunnen specificeren in de SQL-instructie:

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



  1. Batch-modus normalisatie en prestaties

  2. Rails Migration veranderende kolom om Postgres-arrays te gebruiken

  3. Op zoek naar beschikbaarheid met MySQL (en PHP)?

  4. Foutcode:1062. Dubbele invoer '1' voor sleutel 'PRIMARY'