在postgresql中的insert语句中加密密码会引发错误(需要添加显式类型转换)

时间:2016-10-26 06:58:57

标签: mysql postgresql encryption casting password-encryption

postgresql新手。这可能很简单;但我没有得到它。

我在mysql中有这个:

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

在关于Stackoverflow的密码加密/散列和各种类似问题之后参考postgresql文档;

我在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。

1 个答案:

答案 0 :(得分:3)

这不是答案,而是简要解释如何找到错误的来源。

首先让我们找到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参数,该参数提供搜索数据库对象的信息:

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

这意味着将在模式中搜索对象,其中包含当前用户的名称,如果没有找到,则在模式public中搜索。

最后让我们检查当前用户:

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

因为您可以看到使用实际为nd的{​​{1}}无法找到架构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

最后,您可以在SQL语句中显式指定架构:

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