|
|
|
Supreme Being
      
участник
Last Login: 17.10.2006 7:27
Сообщ.: 113,
Visits: 1 241
|
|
Как зарезервировать значение ID-поля таблицы для последующей возможной вставки записи с этим ID?
Т.е. до реальной вставки записи пользователь должен видеть её будущий уникальный номер. И чтобы без проблем мог делать вставку не опасаясь, что этот ID будет занят! Или не делать вставку, если передумал :)
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
Единственный надежный способ это делать предварительную вставкуи получать id этой записи. Как вариант можно пытаться убрать с колонки признак IDENTIY и генерить (и вставлять) id самостоятельно, но это будет ненадежно в многопользовательской среде.
Зачем вообще тебе это нужно? Поле id по своей сути это всегда служебное поле. Зачеи пользователю знать и видеть его значение?
|
|
|
|
|
Supreme Being
      
участник
Last Login: 17.10.2006 7:27
Сообщ.: 113,
Visits: 1 241
|
|
Такое вот требование у заказчика!!!
Чтобы при заполнении формы, там был указан ID!!!
При предварительной вставке! Как мне потом убивать запись, если юзер не захочет ничего продолжать делать, а просто закроет окошко браузера?
Создать какое-нить поле флага - информирующее о действительном создании записи?
Но как потом узнать можно ли удалять записи с отсутсвующим флагом, не редактируется ли она в данный момент другим юзером
Можно открывать транзакцию конечно, но опять же, если юзер решит закрыть окно или просто будет тупо смотреть на экран в течении часа, она будет потом висеть, заблокировав при этом всю таблицу!
Будет не приятно!
Жаль, что нет сиквенсов!
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
А если схитрить и показывать максимальное значение id+1? :)
Но на самом деле ничего не вставлять.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 17.10.2006 7:27
Сообщ.: 113,
Visits: 1 241
|
|
если хитрить, то значит обманывать!
И запись может не лечь в базу именно под этим номером, если в это время кто-то другой добавил запись
Но решение у меня вроде появилось (пока не реализованое):
В момент открытия формы добавления записи
в базе действительно вставляем запись
берём её ID и показываем клиенту
далее удаляем запись с этим ID
а потом, если всё же юзер решить сохранить свою запись,
то делаем SET IDENTITY OFF (или ON - точно не помню) (разрешаем правку ключевого поля)
и вставляем запись с готовым ID
Как на первый взгляд решение? Должно подойти?
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
[quote="Karbofos"]если хитрить, то значит обманывать!
И запись может не лечь в базу именно под этим номером, если в это время кто-то другой добавил запись[/quote]
Все так, согласен. Просто требование глупое и поэтому я и предложил такое решение.
[quote="Karbofos"]Но решение у меня вроде появилось (пока не реализованое):
В момент открытия формы добавления записи
в базе действительно вставляем запись
берём её ID и показываем клиенту
далее удаляем запись с этим ID
а потом, если всё же юзер решить сохранить свою запись,
то делаем SET IDENTITY OFF (или ON - точно не помню) (разрешаем правку ключевого поля)
и вставляем запись с готовым ID
Как на первый взгляд решение? Должно подойти?[/quote]
Должно сработать. Сделай это все внутри хранимой процедуры и внутри транзакции чтобы в случае ошибки отключить IDENTITY_INSERT.
Такое решение будет работать только для одной таблицы так как нельзя включить IDENTITY_INSERT для нескольких таблиц одновременно. Значит в многопользовательской среде могут начаться проблемы.
Может все-таки вставдять пустую запись, получать ее id и далее делать UPDATE вместо INSERT. Чтобы таблица не замусоривовалась незаконченными записями введи поле dtCreated DEFAULT(getdate()) и сделай job удаляющий пустые записи у которых dtCreated меньше текущей даты скажем на неделю.
|
|
|
|
|
новичок
      
участник
Last Login: 09.02.2006 6:18
Сообщ.: 2,
Visits: 23
|
|
| решение конечно не плохое, но как быть с пропуском значений в ID ? (или это не критично)
|
|
|
|
|
Supreme Being
      
участник
Last Login: 14.11.2007 10:35
Сообщ.: 105,
Visits: 1 152
|
|
>>>то делаем SET IDENTITY OFF (или ON - точно не помню) (разрешаем правку ключевого поля)
и вставляем запись с готовым ID
А если кто-то вставит запись, то ID все-равно окажется занятым, и если даже ошибка не произойдет, то чужая запись будет затерта как я полагаю. Так что шутить с полем ID не есть хорошо :)
|
|
|
|
| | |