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

генератор, сбрасывающийся каждый месяц

Добавлено: 03 сен 2006, 23:38
nord
Есть БД под Firebird 1.5. Как в ней сделать генератор, значение которого каждый месяц будет сбрасываться? Нужно для организации нумерации документов в пределах месяца. С помощью триггера, как я понимаю, делать этого не стоит... А как тогда?

Добавлено: 04 сен 2006, 08:39
Dimitry Sibiryakov
Ручками, через SET GENERATOR. Под управлением шедулера, например: простейший скрипт 1-го числа каждого месяца в 00:00.

Re: генератор, сбрасывающийся каждый месяц

Добавлено: 04 сен 2006, 10:10
Фанис
nord писал(а):Есть БД под Firebird 1.5. Как в ней сделать генератор, значение которого каждый месяц будет сбрасываться? Нужно для рганизации нумерации документов в пределах месяца.
Генератор для этих целей использовать не стоит - потому как могут быть дыры в последовательностях. Проще создать поля xyear,xmonth, numdoc, уникальный индекс по этим полям, при создании записи делать запрос select max(numdoc)+1 from docs where xyear=2006 and xmonth=8
или прописать ХП.

Добавлено: 04 сен 2006, 10:24
WildSery

Re: генератор, сбрасывающийся каждый месяц

Добавлено: 04 сен 2006, 10:27
WildSery
Фанис писал(а):Генератор для этих целей использовать не стоит - потому как могут быть дыры в последовательностях.
Дыры в последовательностях будут и в вашем случае. Скажем, создали документ, создали второй, первый удалили непосредственно. Всё, готова дырка в нумерации.
Видел "экземплярчики" которые в этом случае нумерацию всех последующих документов двигали :(

Добавлено: 04 сен 2006, 11:40
nord
Все способы ручками сбрасывать генератор чреваты коллизиями. Момента, когда никто в базе работать не будет, может и не настать: задача мелкая, сервер, скорее всего, на ночь будут выключать. Дыры в нумерации ничего страшного из себя не представляют. Вариант с запросом тоже не катит: если его одновременно запросят двое, то получат одинаковые номера.
Я думал, что есть какой-нибудь механизм (или изврат какой) а ля GEN_ID, который позволяет сделать обнуление с гарантией того, что оно будет произведено до того, как будет извлечено первое значение в месяце из генератора.

Добавлено: 04 сен 2006, 12:01
WildSery
Типа у тебя куча народу в 11:59:59 в базе документы создаёт?
Бывает и такое. Но тогда не избежать ситуаций "а вот я точно успела прошлым месяцем, а у меня номер почему-то сбросился, верните!", или "я отвлеклась на минуту, и не успела, как мне прошлым месяцем оформить?"
ИМХО проблема где-то не в БД, а в бизнес-логике.