Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zaszyfruj hasło w instrukcji insert w postgresql zgłasza błąd (należy dodać jawne rzutowanie typu)

Nie jest to właściwie odpowiedź, ale krótkie wyjaśnienie, jak znaleźć źródło błędu.

Przede wszystkim znajdźmy pgcrypto rozszerzenie:

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

Powinien zwrócić coś takiego:

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

Więc pgcrypto zainstalowany w schemacie nd w mojej bazie danych.

Następnie spójrzmy na search_path parametr, który dostarcza informacji gdzie szukać obiektów DB:

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

Oznacza to, że obiekty zostaną przeszukane w schemacie z nazwą bieżącego użytkownika i jeśli nic nie zostanie znalezione, w schemacie public .

Na koniec sprawdźmy aktualnego użytkownika:

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

Jak widać rozszerzenie zainstalowane w schemacie nd nie można znaleźć za pomocą search_path który w rzeczywistości jest postgres, public i otrzymaliśmy błąd:

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.

Istnieje kilka sposobów, jak to naprawić, w zależności od rzeczywistych wartości dla Twojej bazy danych wymienionych powyżej.

Możesz przenieść rozszerzenie do innego schematu, na przykład:

alter extension pgcrypto set schema public;

Możesz zmienić search_path opcja taka jak:

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

Na koniec możesz jawnie określić schemat w instrukcji 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. Jak dodać regułę walidatora połączonych unikalnych pól w Laravel 4?

  2. MySQL - dlaczego nie indeksować każdego pola?

  3. Zdalny dostęp do MySQL

  4. Jak podłączyć bazę danych MySQL do aplikacji C# WinForm?

  5. Problem z indeksami MySQL FULLTEXT