Mysql
 sql >> база данни >  >> RDS >> Mysql

Шифроване на парола в изявление за вмъкване в postgresql хвърля грешка (Необходимо е да се добави изрично привеждане на типа)

Това всъщност не е отговорът, а кратко обяснение как да намерите източника на грешката.

Първо нека намерим pgcrypto разширение:

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

Трябва да върне нещо като:

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

Така че pgcrypto инсталиран в схемата nd в моята база данни.

След това нека разгледаме search_path параметър, който предоставя информацията къде да търсите DB обекти:

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

Това означава, че обектите ще бъдат търсени в схемата с името на текущия потребител и, ако нищо не бъде намерено, в схемата public .

Накрая нека проверим текущия потребител:

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

Както можете да видите разширението, инсталирано в схемата nd не може да бъде намерен с помощта на search_path което всъщност е postgres, public и получихме грешката:

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.

Има няколко начина как да го коригирате в зависимост от действителните стойности за вашата DB, споменати по-горе.

Можете да преместите разширението в друга схема като:

alter extension pgcrypto set schema public;

Можете да промените search_path опция като:

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

Накрая можете да посочите изрично схемата в SQL израза:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL CHAR() функция и UTF8 изход?

  2. не е разрешено да върне набор от резултати от тригер mysql

  3. Съображения за производителност на PDO fetchall()?

  4. Обединяване между таблици в две различни бази данни?

  5. изберете категории с име на родител от една таблица