Показать сообщение отдельно
Старый 07.08.2008, 18:15   #1  
foxsoft2005 is offline
foxsoft2005
Участник
Аватар для foxsoft2005
 
93 / 10 (1) +
Регистрация: 21.11.2006
Итак, как мы все знаем в таблицах Navision для поля типа Integer есть замечательно поле AutoIncrement. Всем понятно, зачем оно нужно. Здесь уже много шло дискуссий на эту тему.

Опишу ситуацию из которой следует, что использование оного свойства может создать кучу проблем (рассматриваем NAV+SQL).

Итак.. Есть таблица, в которой есть поле "No." с AutoIncrement = ДА.

Вставлять из интерфейса в такую таблицу труда не составляет и ошибок не дает. Поле само увеличивается и, вроде, все хорошо. Проблемы возникают, если вставлять в такую таблицу кодом. Нужно всегда помнить о том, что именно в этой таблице именно это поле инкрементное и, следовательно, его не нужно указывать или вычислять. Это не всегда возможно, например по той причине, что кадры могут меняться и новому человеку неизвестно о таких нюансах, как автоинкрементное поле в какой-то там таблице.

Допустим ситуацию - в таблицу вставляются 100 записей. Далее, в процессе работы (по каким-то причинам), последние 5 записей удаляются. Знающие люди понимают, что при вставке новой записи в эту таблицу через интерфейс новая запись будет иметь поле "No." равное 101, а не 96, как того хотелось бы. Т.е. "дыры" в нумерации остаются. Но это не главное.

Допустим теперь, что новый человек получил некую постановку с использованием это таблицы. Ничего не подозревая об автоинкременте, он получает последнее значение (как, например, получается последнее значение 17 таблицы при учете). Это значение в рассматриваемом примере равно как раз 96. Далее, пишется код вставки, а в результате выполнения кода вылезает ошибка SQL-сервера.

Для понимания источника ошибки рассмотрим техническую сторону вопроса:

1. При удалении строк из таблиц с автоинкрементным полем значение этого инкремента не меняется. В нашем случае оно осталось равным 101.
2. SQL сервер позволяет осуществлять принудительную вставку своего значения в инкрементные поля. Для этой цели используется спец. команда (SET IDENTITY_INSERT если быть точным).
3. Принимая во внимание пункты выше - в нашем случае поисходит следующее: при принудительном указании поля "No." Navision выполняет указанную в п.2 команду и осуществляется вставка в обход автоинкремента поля.

А где же ошибка, спросите вы? А суть в том, что для выполнения указанной в п.2 команды пользователь должен обладать минимум ролью db_owner на сервере, что для обычного пользователя системы, обычно, не есть так. Именно с этим фактом ошибка и связана.

Таким образом, получается, что если уж вы используете оное свойство поля, то должны везде его документировать как важный пункт разработки, чтобы люди, которые будут писать код после вас не попались на эту неприятную ошибку. Или не использовать автоинкремент в принципе.

Кстати, как вы думаете, почему, например в 17 таблице, поле "Entry No." не инкрементное, казалось бы - самое применение...
__________________
"И лишь патологоанатом не берет работу на дом" (с) Вишневский