2016-08-17 3 views
1

저는 리눅스/유닉스 관리자라고 말해 봅시다. 그 말은 내 관리자가 이전 PostgreSQL 데이터베이스를 8.4.20을 실행하는 RedHat 서버로 옮기는 작업을했다고했습니다. 7.2.1 db를 성공적으로 이동했지만 7.4.20 db로 이동하는 문제가 발생했습니다.제약 조건 트리거 생성 오류

나는 pg_dump –c filenamepsql < filename을 사용합니다. 문제가되는 db에 대해서는 CREATE CONSTRAINT TRIGGER 문장이 나타날 때까지 모든 것이 실행됩니다. 이 파일에서와 같이 내가 그것을 실행하면 내가 얻을 : 나는 set schema 'pg_catalog';을 실행하면

NOTICE: ignoring incomplete trigger group for constraint "" FOREIGN KEY data(ups) REFERENCES upsinfo(ups) DETAIL: Found referenced table's DELETE trigger. CREATE TRIGGER

내가 얻을 : 참여

ERROR: relation "upsinfo" does not exist

표 것은 (나는 생각한다)은 다음과 같습니다

CREATE TABLE upsinfo (
    ups text NOT NULL, 
    ipaddr inet, 
    rcomm text, 
    wcomm text, 
    reachable boolean, 
    managed boolean, 
    comments text, 
    region text 
); 

CREATE TABLE data (
    date timestamp with time zone, 
    ups text, 
    mib text, 
    value text 
); 

방아쇠 문제 트리거 문 :

CREATE CONSTRAINT TRIGGER "<unnamed>" 
    AFTER DELETE ON upsinfo 
    FROM data 
    NOT DEFERRABLE INITIALLY IMMEDIATE 
    FOR EACH ROW 
    EXECUTE PROCEDURE "RI_FKey_cascade_del"('<unnamed>', 'data', 'upsinfo', 'UNSPECIFIED', 'ups', 'ups'); 

RI_FKey_cascade_del 함수는 다른 버전의 pg_catalog에서 다르게 정의되어 있습니다. search_path는 'public, pg_catalog'로 설정되어 있으므로 스키마를 설정해야하는 이유가 혼란 스럽습니다.

다시 나는 진짜 PostgreSQL DBA가 아니므로 친절하게 노력하십시오.

답변

0

Oof의 경우 입니다. 이전 버전 (업그레이드 할 버전 포함, 8.4는 2009 년에 출시되었으며 2014 년에 지원 종료)

짧은 대답는 한 upsinfo로하고 data 만들고 채워되고, 당신은 갈 아마 잘, 좋은 것,이다. 하지만 외래 키 관계 중 하나가 깨졌습니다.

길게 대답, 글쎄, 내가 무슨 일이 일어나고 있는지 설명 할 수 있는지 보도록하겠습니다. (적어도, 내가 생각하는 것).

원래 테이블 정의 data에는 FOREIGN KEY (ups) REFERENCES upsinfo (ups) ON DELETE CASCADE과 같은 것이 포함되어 있다고 생각합니다. 그 이유는 포스트 그레스가 자동으로 몇 가지 트리거 제약 조건을 만듭니다 .1- data에 대한 새로운 행이있을 때마다 열이 upsinfo의 기존 행과 일치하고, upsinfo에서 행을 삭제할 때마다 해당 행을 삭제하십시오 data에서 일치하는 ups 값을 기준으로합니다.

외래 키 관계가 작동하지 않을 때 그다지 유익하지 않은 오류 메시지가 나타날 수 있습니다. 외래 키를 이해하려면 참조 된 값이 고유해야합니다. 각 고유 값 ups에 대해 하나의 행만 upsinfo에 있어야합니다. 포스트 그레스에 을 알기 위해서는을 알고 있으므로 upsinfo.ups에 고유 색인 또는 기본 키가 있어야합니다.이 경우

, 몇 가지 중 하나를 파괴 할 수있다 :

  1. upsinfo.ups (포스트 그레스 허용하지 말았어야 외래 키에 기본 키 또는 고유 인덱스가 없지만 아주 오래된 버전에서 할 수 있습니다)
  2. 는 고유 인덱스로 사용이 있지만, 성공적으로 가져되지 않은, 그래서 제대로 어느 경우 (매우 이전 버전에서 다시 가능성 버그)

을 고유성을 시행하지 않았다 그 외래 키 관계가 메신저라면 포루투갈, 당신은 일단 수입이 완료되면 그것을 고칠 수 있습니다. 먼저 upsinfo.ups에 고유 색인을 작성하고 문제가 있는지 확인하십시오. 그렇다면 중복 된 항목을 해결하고 작동 할 때까지 다시 시도하십시오. 다음과 같이 실행합니다 일들이 작업하는 경우는 가능합니다, 물론

ALTER TABLE data 
    ADD FOREIGN KEY (ups) REFERENCES upsinfo (ups) ON DELETE CASCADE; 

을 당신은 아마 그 오류를 무시하고 단지 앞으로 이동 할 수있어이 경우 외래 키를 수정할 필요가 없습니다.

호프가 도움이되고 행운을 빈다.

0

이것은 ON DELETE CONSTRAINT의 일부인 것처럼 보입니다. 내가 너라면, 나는 그런 모든 문장을 삭제하고 목표 테이블에 대한 적절한 제약 정의로 바꿀 것이다.

CREATE TABLE bookings (
    boo_id serial NOT NULL, 
    boo_hotelid character varying NOT NULL, 
    boo_roomid integer NOT NULL, 
    CONSTRAINT pk_bookings 
     PRIMARY KEY (boo_id), 
    CONSTRAINT fk_bookings_boo_roomid 
     FOREIGN KEY (boo_roomid) 
     REFERENCES rooms (roo_id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE 
) WITHOUT OIDS; 

을 그리고이 부분은 내부적으로 트리거 작성합니다 것입니다 :

테이블 정의는 다음과 같아야합니다

CONSTRAINT fk_bookings_boo_roomid 
     FOREIGN KEY (boo_roomid) 
     REFERENCES rooms (roo_id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE 

을하지만, 솔직히 말해서, 나는에 대한 이해가없는 지원되지 않는 버전으로 업그레이드. Postgres가 버전 9.5인지 알지?

+0

도움 주셔서 감사합니다. (그리고 부드러 우며) 전형적인 이야기입니다. 아무도 소프트웨어를 수년간 유지하고 아무도 갑자기 모든 상처를 입지 않습니다. 나는 새로운 서버에서 Postgres 버전을 업데이트 할 것을 요청할 것이다. –