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

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
Cloudy
Сообщения: 3
Зарегистрирован: 03 ноя 2004, 16:49

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

Сообщение Cloudy » 17 мар 2005, 21:49

Есть две связанные простейшие таблицы. Одна ссылается на другую. Есть 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 еще триггеры сделать?

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 18 мар 2005, 14:06

при этом оба запроса:

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

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 18 мар 2005, 14:26

А также select count(*) from book where b_id=0

Cloudy
Сообщения: 3
Зарегистрирован: 03 ноя 2004, 16:49

Сообщение Cloudy » 18 мар 2005, 20:02

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

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

Cloudy
Сообщения: 3
Зарегистрирован: 03 ноя 2004, 16:49

Сообщение Cloudy » 06 апр 2005, 13:37

dimitr писал(а):при этом оба запроса:

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

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

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

Сообщение kdv » 06 апр 2005, 14:54

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

Ответить