以下适用于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 state: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()?
答案 0 :(得分:1)
解释可能是模块已安装到不在搜索路径中的模式中 - 或者安装到错误的数据库中。 使用此查询诊断您的问题并报告输出:
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*
答案 1 :(得分:0)
好的,问题解决了。
我正在创建pgcrypto扩展名作为脚本中的第一个操作。然后我删除并添加了VGDB数据库。这就是为什么pgcrypto在创建之后立即就在那里,但是在脚本中稍后运行sql或者打开pgadmin时不存在。
此脚本用于设置新数据库,如果我在新数据库上尝试过,则创建扩展程序会立即失败。
我的坏。感谢你的帮助,Erwin。
答案 2 :(得分:0)
确保在所需的架构上安装扩展。
sudo -i -u postgres
psql $database
CREATE EXTENSION pgcrypto;
答案 3 :(得分:0)
只需提及像这样安装 pgcrypto 的 de schema:
@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;
答案 4 :(得分:-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时,它不会在VGDB或postgres数据库中显示pgcrypto,即使psql调用的上述查询显示已安装pgcrypto。
使用psql执行“create extension ...”命令后是否需要提交?我的其他DDL或SQL语句在使用psql执行时都不需要提交。
它开始看起来像psql只是flakey。还有另一种方法可以调用“create extension pgcrypto” - 例如使用Python的数据库支持类 - 还是必须通过psql运行?