Страница 1 из 1

FK периодически не срабатывает

Добавлено: 17 мар 2005, 21:49
Cloudy
Есть две связанные простейшие таблицы. Одна ссылается на другую. Есть PK и там и там. Есть FK в зависимой таблице на поле в основной таблице.

Немного упрощенно так:

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

CREATE TABLE BOOK (
    B_ID INTEGER NOT NULL,
    B_NUMBER INTEGER,
    B_DATE DATE,
    B_AMOUNT NUMERIC(15,2)
);
ALTER TABLE BOOK ADD CONSTRAINT PK_BOOK PRIMARY KEY (B_ID);

CREATE TABLE ENTRY (
    E_ID INTEGER NOT NULL,
    E_B_ID INTEGER NOT NULL,
    E_D_A_ID INTEGER,
    E_C_A_ID INTEGER,
    E_DATE DATE,
    E_AMOUNT NUMERIC(15,2)
);
ALTER TABLE ENTRY ADD CONSTRAINT PK_ENTRY PRIMARY KEY (E_ID);
ALTER TABLE ENTRY ADD CONSTRAINT FK_ENTRY FOREIGN KEY (E_B_ID) REFERENCES BOOK (B_ID);
На сервере обновили Firebird с версии 1.0.3.972 на 1.5.2.4731 classic. Поставили именно из-за классик версии. Там двупроцессорная машина и очень хотелось использовать потенциал двух процов полноценно.
Клиенты все разные Firebird версии 1.0.3.972 и 1.5.2.4731.
Сервер не зависал и не падал 100%. Про клиентов однозначно сказать не могу, но все клянуться, что никто не зависал.
Теперь периодически (в среднем из 500 одна) появляются записи с разных машин в зависимой таблице ENTRY со значением "0" (не NULL, а именно 0) по связанному полю E_B_ID. Физического удаления записей из BOOK не существует вообще. Т.е. я могу 100% гарантировать, что delete в BOOK не осуществлялся.

Ну ладно было бы NULL, можно было бы подумать, что это программа где-то глючит. Но какого черта 0 то подставляется? Куда копать? До смены сервера баз данных таких глюков замечено не было. Программа простейшая и находиться в эксплуатации уже года три как. Такая же программа стоит и в других местах со значительно большим количеством данных. Нигде кроме как в этом месте вышеуказанных проблем нету. Пока пересоздали все ключи. Завтра посмотрю, что получилось.

Может в дополнение к FK еще триггеры сделать?

Добавлено: 18 мар 2005, 14:06
dimitr
при этом оба запроса:

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

select count(*) from entry where e_b_id = 0
select count(*) from entry where e_b_id + 0 = 0
возвращают одно и то же?

Добавлено: 18 мар 2005, 14:26
Merlin
А также select count(*) from book where b_id=0

Добавлено: 18 мар 2005, 20:02
Cloudy
Merlin писал(а):select count(*) from book where b_id=0
Это я проверил сразу. Потому как тоже подумал, что возможно одна из записей получила 0 в PK. Но таких записей нету.

Предыдущее предложение обязательно проверю в понедельник.

Добавлено: 06 апр 2005, 13:37
Cloudy
dimitr писал(а):при этом оба запроса:

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

select count(*) from entry where e_b_id = 0
select count(*) from entry where e_b_id + 0 = 0
возвращают одно и то же?
Вот опять появились три записи.
По данным запросам показывает одинаковые данные.
В таблице BOOK записей с B_ID=0 нет.

Добавлено: 06 апр 2005, 14:54
kdv
создай триггер, с проверкой если e_b_id = 0, то exception.
на after update и after insert. и прикажи операторам при появлении ошибки замереть и не двигаться, чтобы они тебе описали, что и как они делают.