pg_restoreエラー:関数raise_err(unknown)が存在しません

Aug 21 2020

更新をプッシュした後に最近機能を停止したpg_dumpとpg_restoreを使用して、データベースのバックアップを毎日実行しています。

整合性の問題があるいくつかのデータのクイックチェックと同じようにvalidate_idCase/Whenステートメントである関数があります。次のようになります。

CREATE OR REPLACE FUNCTION validate_id(
    _string text,
    _type type
) RETURNS boolean AS
$$ SELECT CASE WHEN (stuff) THEN TRUE WHEN (other stuff) THEN TRUE When (more stuff) THEN raise_err('Not an accepted type, the accepted types are: x y z') ELSE FALSE $$
LANGUAGE SQL;

この関数を追加したので、このコマンドを使用してダンプすると、次のようになります。

pg_dump -U postgres -h ipaddress -p 5432 -w -F t databaseName > backupsfolder/databaseName.tar

このコマンドを使用する場合:

pg_restore -U postgres -h localhost -p 5432 -d postgres -C "backupsfolder/databaseName.tar"

2日前の時点で、これはエラーをスローします。

pg_restore: error: could not execute query: ERROR: function raise_err(unknown) does not exist

私は何をすべきかかなり迷っています。機能を復元する前に、この機能を復元しようとしているのではないかと思いraise_errます。これはpostgresに組み込まれていると思いました(できますSELECT raise_err('Hello, World');)。これは可能ですか?CASEブール値のみを返す必要があるので、それは私のステートメントですか?すべての権限は正しいようで、以前のバックアップでの復元は正常に機能します。

回答

1 LaurenzAlbe Aug 21 2020 at 14:26

問題はraise_err、関数コードでスキーマ修飾されていないことです。

これは潜在的に危険です。悪意のあるユーザーが独自の関数raise_errを作成search_pathし、間違った関数が呼び出されるように設定する可能性があります。

のでpg_restore、通常スーパーユーザによって実行され、これはセキュリティ上の問題になることがあります。このような関数がインデックス定義で使用されていると想像してみてください。

これらの理由pg_dumppg_restore、空を設定するsearch_pathのPostgreSQLの現在のバージョンで。

問題の解決策は、SQLステートメントで関数のスキーマを明示的に使用することです。

HelpMeExitVim Aug 26 2020 at 02:42

両方の関数の検索パスを明示的に設定することで、この問題を解決することにraise_err()なりvalidate_id()ましたpublic

ALTER FUNCTION validate_id(text,text) SET search_path=public;
ALTER FUNCTION raise_err(text,text) SET search_path=public;