postgresql中插入语句中的加密密码抛出错误(需要添加显式类型转换)

2024-04-28

刚接触 postgresql。这可能很简单;但我不明白。

我在 mysql 中有这个:

insert into APP_USERS VALUES
(1, 'admin', 'adminemailid','', 'System', 'Administrator', 'SysAdmin', 'CompanyName',
sha('password123'), 'ADMIN', 2,'SCREEN',0);

在参考了有关密码加密/散列的 postgresql 文档以及 Stackoverflow 上的各种类似问题之后;

我尝试过在 postgresql 中相当于:

insert into APP_USERS VALUES
(1, 'admin', 'adminemailid','', 'System', 'Administrator', 'SysAdmin', 'CompanyName',
crypt('password123',gen_salt('sha1')), 'ADMIN', 2,'SCREEN',0)

但;它在函数中向我抛出一个错误gen_salt():

没有函数与给定名称和参数类型匹配。您可能需要添加显式类型转换。

(列(字段)密码的数据类型为性格各异.)

我阅读了有关 postgresql 中类型转换的各种手册,并尝试转换该函数。

但;没有用。我遇到过各种类似的错误。

我能知道到底缺少什么吗?或者类型转换的确切方法是什么? 或者我是否需要为此添加 chkpass 模块(扩展)?

我已经有了 pgcrypto 扩展并且正在使用 postgresql 9.6。


它实际上并不是答案,而是如何找到错误根源的简要说明。

首先我们要找到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         ║
╚════════════════════╧════════════╝

So the pgcrypto安装在架构中nd在我的数据库中。

接下来让我们看看search_path参数提供在何处搜索数据库对象的信息:

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.

有多种方法可以根据上述数据库的实际值来修复它。

您可以将扩展移动到另一个架构,例如:

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');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

postgresql中插入语句中的加密密码抛出错误(需要添加显式类型转换) 的相关文章

随机推荐