PostgreSQL pgp_sym_encrypt () не работает в версии 9.1 - PullRequest
0 голосов
/ 29 декабря 2011

В PostgreSQL 8.4 работает следующее:

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

Когда я пробую его в версии 9.1, я получаю следующее:

ОШИБКА: функция pgp_sym_encrypt (неизвестно, неизвестно) не работаетсуществовать ЛИНИЯ 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 (текст, текст) не существует

У меня установлен pgcrypto.У кого-нибудь есть pgp_sym_encrypt (), работающий в PostgreSQL 9.1?

Ответы [ 4 ]

2 голосов
/ 29 декабря 2011

По объяснению может быть, что модуль был установлен в схему, которой нет в вашем пути поиска - или в неправильную базу данных.
Диагностируйте вашу проблему с помощью этого запроса и сообщите результат:

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*
0 голосов
/ 19 октября 2018

Убедитесь, что вы установили расширение на нужную схему.

sudo -i -u postgres
psql $database
CREATE EXTENSION pgcrypto;
0 голосов
/ 29 декабря 2011

ОК, проблема решена.

Я создавал расширение pgcrypto в качестве первой операции в сценарии. Затем я удалил и добавил базу данных VGDB. Вот почему pgcrypto был там сразу после его создания, но не существовал при запуске sql позже в скрипте или при открытии pgadmin.

Этот сценарий предназначен для настройки новых баз данных, и, если бы я попробовал его на новой базе данных, сразу же создать расширение не удалось бы.

Мой плохой. Спасибо за помощь, Эрвин.

0 голосов
/ 29 декабря 2011

Я снова запустил мой (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, он не показывает pgcrypto ни в базах данных VGDB, ни в postgres, хотя запрос, вызванный psql, показывает, что pgcrypto установлен.

Может ли быть проблема с необходимостью фиксации после использования psql для выполнения команды "создать расширение ..."? Ни один из моих других операторов DDL или SQL не требует фиксации при выполнении с помощью psql.

Это начинает выглядеть так, будто psql просто ненормальный. Есть ли другой способ вызвать «создать расширение pgcrypto» - например, с классами поддержки базы данных Python - или это нужно запускать через psql?

...