pg_restoreエラー:関数raise_err(unknown)が存在しません
更新をプッシュした後に最近機能を停止したpg_dumpとpg_restoreを使用して、データベースのバックアップを毎日実行しています。
整合性の問題があるいくつかのデータのクイックチェックと同じようにvalidate_id
、Case/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
ブール値のみを返す必要があるので、それは私のステートメントですか?すべての権限は正しいようで、以前のバックアップでの復元は正常に機能します。
回答
問題はraise_err
、関数コードでスキーマ修飾されていないことです。
これは潜在的に危険です。悪意のあるユーザーが独自の関数raise_err
を作成search_path
し、間違った関数が呼び出されるように設定する可能性があります。
のでpg_restore
、通常スーパーユーザによって実行され、これはセキュリティ上の問題になることがあります。このような関数がインデックス定義で使用されていると想像してみてください。
これらの理由pg_dump
やpg_restore
、空を設定するsearch_path
のPostgreSQLの現在のバージョンで。
問題の解決策は、SQLステートメントで関数のスキーマを明示的に使用することです。
両方の関数の検索パスを明示的に設定することで、この問題を解決することに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;