gbak: ERROR: Foreign key reference target does not exist

Ремонт и восстановление баз данных InterBase, Firebird, Yaffil

Модераторы: kdv, Alexey Kovyazin

Ответить
vortex
Сообщения: 9
Зарегистрирован: 17 июн 2007, 21:01

gbak: ERROR: Foreign key reference target does not exist

Сообщение vortex » 07 июл 2007, 23:40

Предпринимаю попытку перевода базы в 1 диалекте с ib 7.5 на firebird 2.0.1 (пока superserver). Все вроде нормально, но при ресторе базы под fb 2 индекса в одной таблице не активируются. Подскажите plz с чем может быть связана ошибка? Чувствую, что все на самом деле просто, а доказать не могу :) Структура таблиц следом за логом:
gbak: activating and creating deferred index RDB$FOREIGN66
gbak:cannot commit index RDB$FOREIGN66
gbak: ERROR:violation of FOREIGN KEY constraint "PKDOCUMENTS" on table "DOCUMENTS"
gbak: ERROR: Foreign key reference target does not exist
gbak: activating and creating deferred index RDB$FOREIGN67
gbak:cannot commit index RDB$FOREIGN67
gbak: ERROR:violation of FOREIGN KEY constraint "PKDOCUMENTS" on table "DOCUMENTS"
gbak: ERROR: Foreign key reference target does not exist
gbak: activating and creating deferred index RDB$FOREIGN50
..........
gbak: committing metadata
gbak:finishing, closing, and going home
gbak:Database is not online due to failure to activate one or more indices.
gbak:Run gfix -online to bring database online without active indices.

Индексы RDB$FOREIGN66 и RDB$FOREIGN67 принадлежат таблице DOCUMENTLINKS следующей структуры:

Код: Выделить всё

CREATE TABLE DOCUMENTLINKS (
    DEBETDOC   INTEGER NOT NULL,
    CREDITDOC  INTEGER NOT NULL,
    LINKSUMMA  DOUBLE PRECISION NOT NULL,
    LINKTYPE   SMALLINT NOT NULL
);

ALTER TABLE DOCUMENTLINKS ADD CONSTRAINT PKDOCUMENTLINKS PRIMARY KEY (DEBETDOC, CREDITDOC); /* RDB$PRIMARY10 */

ALTER TABLE DOCUMENTLINKS ADD FOREIGN KEY (DEBETDOC) REFERENCES DOCUMENTS (ID); /* это RDB$FOREIGN66 */
ALTER TABLE DOCUMENTLINKS ADD FOREIGN KEY (CREDITDOC) REFERENCES DOCUMENTS (ID); /* это RDB$FOREIGN67 */

Структура таблицы DOCUMENTS, на которую ссылаются внешние ключи:

Код: Выделить всё

CREATE TABLE DOCUMENTS (
    ID              INTEGER NOT NULL,
    FIRM            INTEGER NOT NULL,
    OPERATIONDATE   DATE NOT NULL,
    KIND            INTEGER NOT NULL,
    TOTALSUM        DOUBLE PRECISION DEFAULT 0 NOT NULL,
    CURRENCY        INTEGER NOT NULL,
    CURRRATE        DOUBLE PRECISION,
    PARTNER         INTEGER NOT NULL,
    AGENT           INTEGER NOT NULL,
    STOCK           INTEGER NOT NULL,
    IMPORTED_ID     INTEGER DEFAULT 0 NOT NULL,
    FLAG            INTEGER DEFAULT 0 NOT NULL,
    DOCTYPE         INTEGER NOT NULL,
    DOCNUMBER       VARCHAR(10) NOT NULL COLLATE PXW_CYRL,
    DOCDATE         DATE NOT NULL,
    DOCCURRENCY     INTEGER NOT NULL,
    DOCCURRRATE     DOUBLE PRECISION,
    PREV_DOCTYPE    INTEGER,
    PREV_DOCNUMBER  VARCHAR(10) COLLATE PXW_CYRL,
    PREV_DOCDATE    DATE,
    EXPECTEDDATE    DATE NOT NULL,
    SCHEME          SMALLINT default 0 NOT NULL,
    CONTRACT        INTEGER default 0 NOT NULL,
    REALDOCTYPE     INTEGER NOT NULL
);

ALTER TABLE DOCUMENTS ADD CONSTRAINT PKDOCUMENTS PRIMARY KEY (ID);


/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/

ALTER TABLE DOCUMENTS ADD CONSTRAINT FKDOC_TYPE FOREIGN KEY (REALDOCTYPE) REFERENCES T$DOCUMENT_TYPES (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (DOCTYPE) REFERENCES T$DOCUMENT_TYPES (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (KIND) REFERENCES T$KINDS (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (CURRENCY) REFERENCES CURRENCIES (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (PARTNER) REFERENCES PARTNERS (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (AGENT) REFERENCES PARTNERS (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (FIRM) REFERENCES PARTNERS (ID);
ALTER TABLE DOCUMENTS ADD FOREIGN KEY (STOCK) REFERENCES PARTNERS (ID);


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX DOCUMENTS_IDX_BROWSE ON DOCUMENTS (DOCTYPE, DOCDATE);
CREATE INDEX ELDOC_BROWSE ON DOCUMENTS (PREV_DOCDATE, REALDOCTYPE);
CREATE INDEX IDOCNUMBER ON DOCUMENTS (DOCNUMBER);
CREATE DESCENDING INDEX IXDOCUMENTS_BROWSE ON DOCUMENTS (OPERATIONDATE, DOCTYPE);
p.s. поиском нашел только 1 описание похожей ошибки в инете - там написано, что это может быть связано с ошибками индексов основной таблицы. Запускал валидацию - ошибок нет, да и откуда им взяться сразу после рестора. Заранее спасибо.

Или у меня просто дубли в поле ID таблицы DOCUMENTS? Так там вроде уникальный primary key по этому полю.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 08 июл 2007, 01:27

это значит что в таблице в столбце FK есть значение, которого нет по ссылке в справочной таблице в ПК. Бывает такое, при повреждениях БД. Бэкап разумеется пройдет, а на ресторе вот такой облом.
Нужно выполнять запрос, который найдет несоответствия (пропавшие id).

vortex
Сообщения: 9
Зарегистрирован: 17 июн 2007, 21:01

Сообщение vortex » 08 июл 2007, 03:01

О, спасибо за разъяснение :idea: Отловил несуществующую запись запросом

Код: Выделить всё

select dl.debetdoc linkedtable, d.id mastertable
from documentlinks dl  
left join documents d on (dl.debetdoc = d.id)
where d.id is null
В итоге индексы создались. thanx

Ответить