以下内容适用于 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() 吗?
一种解释可能是该模块安装到不在您的搜索路径中的架构中 - 或者安装到错误的数据库中。
使用此查询诊断您的问题并报告输出:
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*
确保在所需的架构上安装扩展。
sudo -i -u postgres
psql $database
CREATE EXTENSION pgcrypto;
好的,问题解决了。
我正在创建 pgcrypto 扩展作为脚本中的第一个操作。然后我删除并添加了 VGDB 数据库。这就是为什么 pgcrypto 在创建后立即存在,但在稍后在脚本中运行 sql 或当我打开 pgadmin 时不存在。
此脚本用于设置新数据库,如果我在新数据库上尝试它,创建扩展将立即失败。
我的错。感谢您的帮助,埃尔文。
只需提及安装 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;
我再次运行我的(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 运行?