Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Enkripsi kata sandi dalam pernyataan penyisipan di postgresql menimbulkan kesalahan (Perlu menambahkan pemeran tipe eksplisit)

Ini bukan jawaban sebenarnya tapi penjelasan singkat bagaimana menemukan sumber kesalahan.

Pertama-tama mari kita temukan pgcrypto ekstensi:

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

Seharusnya mengembalikan sesuatu seperti:

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

Jadi pgcrypto dipasang di skema nd di database saya.

Selanjutnya mari kita lihat ke search_path parameter yang memberikan informasi tempat mencari objek DB:

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

Ini berarti bahwa objek akan dicari dalam skema dengan nama pengguna saat ini dan, jika tidak ditemukan, dalam skema public .

Akhirnya mari kita periksa pengguna saat ini:

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

Jadi seperti yang Anda lihat ekstensi dipasang di skema nd tidak dapat ditemukan menggunakan search_path yang sebenarnya adalah postgres, public dan kami mendapatkan kesalahan:

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.

Ada beberapa cara untuk memperbaikinya tergantung dari nilai sebenarnya untuk DB Anda yang disebutkan di atas.

Anda dapat memindahkan ekstensi ke skema lain seperti:

alter extension pgcrypto set schema public;

Anda dapat mengubah search_path pilihan seperti:

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

Akhirnya Anda dapat secara eksplisit menentukan skema dalam pernyataan 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. 1130 Host 'amazon-ec2-ip' tidak diizinkan untuk terhubung ke server MySQL ini

  2. Bagaimana cara memeriksa Apostrof dengan klausa where menggunakan mysql

  3. swi prolog mysql + web

  4. Optimalkan kueri peringkat lambat

  5. Mengurangi satu baris data dari yang lain di SQL