PostgreSQL 데이터베이스 덤프를 얻었습니다.
pg_dump -U user-name -d db-name -f dumpfile
그런 다음 다른 데이터베이스에서 다음을 사용하여 복원을 진행합니다.
psql X -U postgres -d db-name-b -f dumpfile
내 문제는 데이터베이스에 참조 제약 조건, 검사 및 트리거가 포함되어 있으며 복원 중에 정보가 검사 순서를 따르지 않는 순서로로드되지 않기 때문에 이러한 검사 중 일부 (특히 검사가 특히 좋아 보이는 검사)가 실패한다는 것입니다. 예를 들어, 테이블에 행을 삽입하는 것은 관련이 없는 다른 테이블에 조건이 있는지 여부를 확인 CHECK
하는 plpgsql
함수를 호출하는 것과 연관 될 수 있습니다 . 후자의 테이블이 psql
전자의 이전 테이블에 의해로드되지 않으면 오류가 발생합니다.
다음은 덤프 된 데이터베이스를 pg_dump
복원 할 수없는 SSCCE입니다 .
CREATE OR REPLACE FUNCTION fail_if_b_empty () RETURNS BOOLEAN AS $$
SELECT EXISTS (SELECT 1 FROM b)
$$ LANGUAGE SQL;
CREATE TABLE IF NOT EXISTS a (
i INTEGER NOT NULL
);
INSERT INTO a(i) VALUES (0),(1);
CREATE TABLE IF NOT EXISTS b (
i INTEGER NOT NULL
);
INSERT INTO b(i) VALUES (0);
ALTER TABLE a ADD CONSTRAINT a_constr_1 CHECK (fail_if_b_empty());
덤프 복원 중에 이러한 제한 조건을 모두 사용 불가능하게하고 (명령 행에서) 나중에 다시 사용 가능하게하는 방법이 있습니까? PostgreSQL 9.1을 실행하고 있습니다.
CHECK
제약 조건 에서 다른 테이블을 참조하는 함수를 사용하면 공식적으로 지원되지 않고 허용되므로 모든 보증이 무효화됩니다. 그러나 CHECK
제약 조건을 선언하면 NOT VALID
모든면에서 나를 위해 일했습니다. 내가 만지지 않은 코너 케이스가있을 수 있습니다 ...
-X
과-d
옵션 이 없습니다pg_dump
.pg_dump
덤프 생산 이다 빈 DB에 복원 할를.