powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сбился GEN_ID
10 сообщений из 10, страница 1 из 1
Сбился GEN_ID
    #39602489
aquamakc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Использую Firebird Embedded 2.5.
Есть таблица с ключевым полем NUM типа bigint.
Для неё создаётся генератор:
Код: sql
1.
CREATE GENERATOR autoIncrementNum


и триггер:
Код: sql
1.
CREATE TRIGGER autoIncrementNum FOR tableName ACTIVE BEFORE INSERT POSITION 0 AS BEGIN NEW.NUM = GEN_ID(autoIncrementNum, 1); END



Всё идёт хорошо, но на одном экземпляре программы внезапно прекратились записи в эту таблицу. В ходе разбирательств увидел, что программа, которая пользует эту БД выдаёт исключение при попытке записи:
авторFirebirdSql.Data.FirebirdClient.FbException (0x80004005): violation of PRIMARY or UNIQUE KEY constraint "INTEG_6" on table "tableName"
Problematic key value is ("NUM" = 336) ---> violation of PRIMARY or UNIQUE KEY constraint "INTEG_6" on table "tableName"
Problematic key value is ("NUM" = 336)
Это исключение выдаётся каждый раз при попытке записи, при этом "NUM" = 336 каждый раз исправно инкрементируется.
Сейчас в таблице менее 5 тыс. записей с корректно заданным значением этого поля (от 1 до последнего с шагом - 1).
Просто в какой-то момент времени почему-то начался отсчёт с нуля.

Собственно вопросы:
1) Из-за чего это могло произойти?
2) Есть ли способ предупредить подобные случаи?
3) Можно ли как-то "починить" функцию без потери данных?
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602497
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aquamakc,

сделай

Код: sql
1.
2.
SELECT MAX(NUM)
FROM tableName



Потом полученное значение подставишь в

Код: sql
1.
ALTER SEQUENCE autoIncrementNum RESTART WITH <значение>
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602501
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: aquamakc
1.
2.
Собственно вопросы:
1) Из-за чего это могло произойти?
2) Есть ли способ предупредить подобные случаи?


1. кто-то сбросил генератор (последовательность)
2. нет. В 2.5 прав на генераторы не было (появилось в 3.0)
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602506
aquamakc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

По пункту 3 подправил генератор в IB Expert руками.

Но первые два всё-ещё волнуют.
"Кто-то" это точно не человек. Нет там, где программа работает таких людей и программ, чтобы открыть БД и сбросить значение генератора. Остаётся только программный сбой.
Может есть идеи, как можно защититься от подобного в будущем?
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602512
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aquamakc,

ну собственно вариантов штатно сбросить генератор только 2:

1. ALTER SEQUENCE или SET GENERATOR
2. GEN_ID(autoIncrementNum, -<значение генератора>)

Теоретически (маловероятно) поскольку используется embedded сервер ошибка в программе могла повлиять. Я с таким ни разу не сталкивался
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602543
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис1. кто-то сбросил генератор (последовательность)

Вероятнее, что кто-то вставил запись со значением не из последовательности.

Хотя "провал" генератора при краше приложения (перезагрузке винды, отключении питания) с
Embedded тоже возможен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602622
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aquamakc,

У меня раньше было пару подобных случаев, когда сбрасывался генератор.
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602797
aquamakc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заполучил логи работы программы за месяц.
Софтина (это, кстати, служба виндовс) работала-работала, всё было нормально, но в один момент значение генератора сбросилось, причём даже не на 0, а на 274. И совершенно без признаков внешнего вмешательства.
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602834
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aquamakc,

А какие признаки вмешательства могли бы быть?
Просто интересно.
...
Рейтинг: 0 / 0
Сбился GEN_ID
    #39602848
aquamakc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSery,

Ну, например, останов программы (службы), которая работает с БД. Без этого доступ к БД невозможен. Из программы выполнение непосредственных запросов к БД осуществить нельзя, такой функционал просто не предусмотрен. Выполнение какой-либо SQL инъекции отобразилось бы в логах.
А этого ничего не было. Просто условно в 00:01:35 запись в таблицу была произведена нормально, следующая в 00:01:55 и все остальные - со сбитым генератором.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сбился GEN_ID
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]