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"
이틀 전부터 다음과 같은 오류가 발생합니다.
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;