PostgreSQL pgp_sym_encrypt()在9.1版中已经破解

时间:2011-12-28 23:35:52

标签: postgresql pgp postgresql-9.1

以下适用于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()?

5 个答案:

答案 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运行?