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"

이틀 전부터 다음과 같은 오류가 발생합니다.

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;