генератор, сбрасывающийся каждый месяц
генератор, сбрасывающийся каждый месяц
Есть БД под Firebird 1.5. Как в ней сделать генератор, значение которого каждый месяц будет сбрасываться? Нужно для организации нумерации документов в пределах месяца. С помощью триггера, как я понимаю, делать этого не стоит... А как тогда?
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: генератор, сбрасывающийся каждый месяц
Генератор для этих целей использовать не стоит - потому как могут быть дыры в последовательностях. Проще создать поля xyear,xmonth, numdoc, уникальный индекс по этим полям, при создании записи делать запрос select max(numdoc)+1 from docs where xyear=2006 and xmonth=8nord писал(а):Есть БД под Firebird 1.5. Как в ней сделать генератор, значение которого каждый месяц будет сбрасываться? Нужно для рганизации нумерации документов в пределах месяца.
или прописать ХП.
Re: генератор, сбрасывающийся каждый месяц
Дыры в последовательностях будут и в вашем случае. Скажем, создали документ, создали второй, первый удалили непосредственно. Всё, готова дырка в нумерации.Фанис писал(а):Генератор для этих целей использовать не стоит - потому как могут быть дыры в последовательностях.
Видел "экземплярчики" которые в этом случае нумерацию всех последующих документов двигали

Все способы ручками сбрасывать генератор чреваты коллизиями. Момента, когда никто в базе работать не будет, может и не настать: задача мелкая, сервер, скорее всего, на ночь будут выключать. Дыры в нумерации ничего страшного из себя не представляют. Вариант с запросом тоже не катит: если его одновременно запросят двое, то получат одинаковые номера.
Я думал, что есть какой-нибудь механизм (или изврат какой) а ля GEN_ID, который позволяет сделать обнуление с гарантией того, что оно будет произведено до того, как будет извлечено первое значение в месяце из генератора.
Я думал, что есть какой-нибудь механизм (или изврат какой) а ля GEN_ID, который позволяет сделать обнуление с гарантией того, что оно будет произведено до того, как будет извлечено первое значение в месяце из генератора.
Типа у тебя куча народу в 11:59:59 в базе документы создаёт?
Бывает и такое. Но тогда не избежать ситуаций "а вот я точно успела прошлым месяцем, а у меня номер почему-то сбросился, верните!", или "я отвлеклась на минуту, и не успела, как мне прошлым месяцем оформить?"
ИМХО проблема где-то не в БД, а в бизнес-логике.
Бывает и такое. Но тогда не избежать ситуаций "а вот я точно успела прошлым месяцем, а у меня номер почему-то сбросился, верните!", или "я отвлеклась на минуту, и не успела, как мне прошлым месяцем оформить?"
ИМХО проблема где-то не в БД, а в бизнес-логике.