PostgreSQL pgp_sym_encrypt() 在版本 9.1 中被破坏

问题描述 投票:0回答:5

以下内容适用于 PostgreSQL 8.4:

insert into credentials values('demo', pgp_sym_encrypt('password', 'longpassword'));

当我在 9.1 版本中尝试时,我得到了这个:

错误:函数 pgp_sym_encrypt(未知,未知) 不存在 LINE 1: 插入凭证值('demo', pgp_sym_encrypt('pass... ^ 提示:没有函数与给定名称和参数类型匹配。您可能需要添加 显式类型转换。

***错误***

错误:函数 pgp_sym_encrypt(未知,未知) 不存在 SQL 状态:42883 提示:没有函数与给定的名称和参数匹配 类型。您可能需要添加显式类型转换。性格:40

如果我尝试一些像这样的显式转换

insert into credentials values('demo', pgp_sym_encrypt(cast('password' as text), cast('longpassword' as text)))

我收到了略有不同的错误消息:

错误:函数 pgp_sym_encrypt(text, text) 不存在

我安装了 pgcrypto。有人在 PostgreSQL 9.1 中使用 pgp_sym_encrypt() 吗?

postgresql pgp postgresql-9.1
5个回答
4
投票

一种解释可能是该模块安装到不在您的搜索路径中的架构中 - 或者安装到错误的数据库中。
使用此查询诊断您的问题并报告输出:

SELECT n.nspname, p.proname, pg_catalog.pg_get_function_arguments(p.oid) as params
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  p.proname ~~* '%pgp_sym_encrypt%'
AND    pg_catalog.pg_function_is_visible(p.oid);

查找数据库中所有模式中的函数。类似于 psql 元命令

\df *pgp_sym_encrypt*

3
投票

确保在所需的架构上安装扩展。

sudo -i -u postgres
psql $database
CREATE EXTENSION pgcrypto;

0
投票

好的,问题解决了。

我正在创建 pgcrypto 扩展作为脚本中的第一个操作。然后我删除并添加了 VGDB 数据库。这就是为什么 pgcrypto 在创建后立即存在,但在稍后在脚本中运行 sql 或当我打开 pgadmin 时不存在。

此脚本用于设置新数据库,如果我在新数据库上尝试它,创建扩展将立即失败。

我的错。感谢您的帮助,埃尔文。


0
投票

只需提及安装 pgcrypto 的架构,如下所示:

@ColumnTransformer(forColumn = "TEST",
        read =  "public.pgp_sym_decrypt(TEST, 'password')",
        write = "public.pgp_sym_encrypt(?, 'password')")
@Column(name = "TEST", columnDefinition = "bytea", nullable = false)
private String test;

-1
投票

我再次运行我的(python)脚本,并且 CREATE EXTENSION 运行没有错误。该脚本也执行这个命令

psql -d VGDB -U postgres -c "select * from pg_available_extensions order by name"

结果集中包括以下内容:

pgcrypto           | 1.0             | 1.0               | cryptographic functions

所以psql认为它已经安装了pgcrypto。

稍后在我执行时在同一个脚本中

psql -d VGDB -U postgres -f sql/Create.Credentials.table.sql

其中 sql/Create.Credentials.table.sql 包含此

insert into credentials values('demo', pgp_sym_encrypt('password', 'longpassword'));

我明白了

psql:sql/Create.Credentials.table.sql:31: ERROR:  function pgp_sym_encrypt(unknown, unknown) does not exist
LINE 1: insert into credentials values('demo', pgp_sym_encrypt('pass...
                                               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

当我打开 pgadmin 时,即使 psql 调用的上述查询显示已安装 pgcrypto,它也不会在 VGDB 或 postgres 数据库中显示 pgcrypto。

使用psql执行“create extension ...”命令后是否会出现需要提交的问题?我的其他 DDL 或 SQL 语句在使用 psql 执行时都不需要提交。

psql 开始看起来很不稳定。是否有另一种方法来调用“创建扩展 pgcrypto” - 例如使用 Python 的数据库支持类 - 还是必须通过 psql 运行?

© www.soinside.com 2019 - 2024. All rights reserved.