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

Запросы, планы, оптимизация запросов, ...

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

Ответить
nord
Сообщения: 4
Зарегистрирован: 03 сен 2006, 23:33

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

Сообщение nord » 03 сен 2006, 23:38

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 04 сен 2006, 08:39

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

Фанис
Сообщения: 17
Зарегистрирован: 16 июн 2005, 19:28

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

Сообщение Фанис » 04 сен 2006, 10:10

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 04 сен 2006, 10:24


WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

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

Сообщение WildSery » 04 сен 2006, 10:27

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

nord
Сообщения: 4
Зарегистрирован: 03 сен 2006, 23:33

Сообщение nord » 04 сен 2006, 11:40

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 04 сен 2006, 12:01

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

Ответить