sql >> Databáze >  >> RDS >> Mysql

Šifrovat heslo v příkazu insert v postgresql vyvolá chybu (Je třeba přidat explicitní typ přetypování)

Ve skutečnosti to není odpověď, ale stručné vysvětlení, jak najít zdroj chyby.

Nejprve najděte pgcrypto rozšíření:

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

Mělo by to vrátit něco jako:

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

Takže pgcrypto nainstalováno ve schématu nd v mé databázi.

Dále se podíváme na search_path parametr, který poskytuje informace, kde hledat objekty DB:

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

To znamená, že objekty budou prohledávány ve schématu se jménem aktuálního uživatele a pokud nic nenajde, ve schématu public .

Nakonec umožňuje zkontrolovat aktuálního uživatele:

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

Jak můžete vidět rozšíření nainstalované ve schématu nd nelze najít pomocí search_path což je ve skutečnosti postgres, public a dostali jsme chybu:

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.

Existuje několik způsobů, jak to opravit v závislosti na skutečných hodnotách pro vaši DB zmíněných výše.

Rozšíření můžete přesunout do jiného schématu, například:

alter extension pgcrypto set schema public;

Můžete změnit search_path možnost jako:

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

Nakonec byste mohli explicitně specifikovat schéma v příkazu SQL:

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



  1. SQL Server 2016:Vytvořte zobrazení

  2. Jak zjistit aktuální úroveň transakce?

  3. Jak odstranit značky ve značce PHP XML MYSQL GCIDE při ponechání textu

  4. mysql časové hodiny