2

以下はPostgreSQL8.4で機能します。

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

バージョン9.1で試してみると、次のようになります。

エラー:関数pgp_sym_encrypt(unknown、unknown)が存在しません行1:資格情報に挿入値('demo'、pgp_sym_encrypt('pass ... ^ヒント:指定された名前と引数の型に一致する関数はありません。明示的に追加する必要がある場合があります型キャスト。

***エラー** *

エラー:関数pgp_sym_encrypt(unknown、unknown)が存在しません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()を持っている人はいますか?

4

5 に答える 5

3

説明として、モジュールが検索パスにないスキーマにインストールされたか、間違ったデータベースにインストールされた可能性があります。
このクエリで問題を診断し、出力を報告します。

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*
于 2011-12-28T23:45:26.657 に答える
0

OK、問題は解決しました。

スクリプトの最初の操作としてpgcrypto拡張機能を作成していました。次に、VGDBデータベースを削除して追加しました。そのため、pgcryptoは作成直後に存在していましたが、スクリプトの後半でSQLを実行したとき、またはpgadminを開いたときに存在しませんでした。

このスクリプトは、新しいデータベースをセットアップするためのものであり、新しいデータベースで試した場合、拡張機能の作成はすぐに失敗します。

私の悪い。助けてくれてありがとう、アーウィン。

于 2011-12-29T03:57:08.970 に答える
0

目的のスキーマに拡張機能をインストールしてください。

sudo -i -u postgres
psql $database
CREATE EXTENSION pgcrypto;
于 2018-10-19T16:45:10.510 に答える
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;
于 2021-07-06T09:56:22.683 に答える
-1

(python)スクリプトを再度実行すると、CREATEEXTENSIONがエラーなしで実行されました。スクリプトもこのコマンドを実行します

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を使用して「createextension...」コマンドを実行した後にコミットする必要があるという問題がありますか?他のDDLまたはSQLステートメントは、psqlで実行されるときにコミットを必要としません。

psqlはただの薄っぺらなように見え始めています。「createextensionpgcrypto」を呼び出す別の方法はありますか(たとえば、Pythonのデータベースサポートクラスを使用)、またはpsqlを介して実行する必要がありますか?

于 2011-12-29T03:37:28.380 に答える