Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.17;
Скачать: CL | DM;

Вниз

Автоинкрементные поля в MS SQL   Найти похожие ветки 

 
kaif ©   (2008-09-08 00:49) [0]

Обычно в IB Или ORACLE для этой цели я юзал генераторы. Генератор - вещь понятная. По сути это глобальная переменная вне контекста транзакции.

В MSSQL для этой цели предлагается юзать тип поля IDENTITY.
А после вставки проверять значение глобальной переменной @@IDENTITY, которая хранит значение "последнего" значения   присвоенного полю IDENTITY  в данной сессии.

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

Вот, что я делал в хранимой процедуре:

1. Вставляю запись в главную таблицу.
2. Сохраняю @@IDENTITY во временной переменной
3. В цикле пытаюсь вставить записи в подчиненную, используя сохраненное значение IDENTITY в локальной переменной.

На самом же деле происходило следующее. По условиям техзадания мне нужно было зачем-то в триггере той самой главной таблицы сделать инсерт еще в одну таблицу. И этот триггер делал этот инсерт. И вот он-то и портил "последнее значение" глобальной переменной @@IDENTITY, так как в той таблице тоже есть полде типа IDENTITY.

Вот такой вот интересный маразм получается.
Если кто-то повесит триггер на таблицу, который вставит что-то в другую таблицу, то закончиться это может потерей правильного значения @@IDENTITY . Причем откуда его тогда брать, уже неизвестно. Похоже нужно воспользоваться запросом по альтернативному ключу к вставленной записи. Но тогда лучше вообще не юзать эту глобальную переменную @@IDENTITY. Или строго-настрого запретить себе и всем остальным что-либо вставлять из триггеров куда-либо. Даже в таблицу логов, если кто-то захочет. А то вдруг какая-то процедура юзает этот @@IDENTITY и он будет запорчен?

Вот так вот.

Готов выслушать битье ногами по полной программе. Просто 10 минут смотрел как ошалелый на то, как "сразу после вставки" в тексте процедуры @@IDENTITY меняет свое значение до неузнаваемости. Пока сообразил, что происходит.


 
sniknik ©   (2008-09-08 01:31) [1]

> Вот, что я делал в хранимой процедуре:
т.е. ничего? тут одни слова, в процедуре это не более чем коментарии.

> Причем откуда его тогда брать, уже неизвестно.
известно. в справке написано, если пройти по ссылкам из @@IDENTITY.
но ты опять просился делать "по аналогиям" не читая как оно на самом деле...

> Но тогда лучше вообще не юзать эту глобальную переменную @@IDENTITY.
это как ложка, в обед ее очень полезно юзать, во время секса она практически бесполезна и лучше ее не юзать, а у Нео ее вообще нет...


 
sniknik ©   (2008-09-08 01:35) [2]

> просился
бросился


 
Германн ©   (2008-09-08 01:52) [3]


> а у Нео ее вообще нет...

Это как? Он что, палочками пользуется?
:)


 
kaif ©   (2008-09-08 03:26) [4]

sniknik ©   (08.09.08 01:31) [1]
> Вот, что я делал в хранимой процедуре:
т.е. ничего? тут одни слова, в процедуре это не более чем коментарии.


Я думал, что хотя бы здесь я с людьми беседую, а не с SQL-сервером.
:)


 
Вариант   (2008-09-08 08:12) [5]


> kaif ©   (08.09.08 00:49)

SCOPE_IDENTITY

Электронная документация по MSSQL Server 2005

"...Допуская, что столбец идентификаторов имеется в обеих таблицах, T1 и T2, функции @@IDENTITY и SCOPE_IDENTITY вернут разные значения в конце инструкции INSERT в таблице T1. Функция @@IDENTITY возвращает значение столбца идентификаторов, добавленное в текущем сеансе последним во всех областях. Это значение, вставленное в таблицу T2. Функция SCOPE_IDENTITY() возвратит значение IDENTITY, вставленное в таблицу T1. Это было последним добавлением, произошедшим в заданной области. Функция SCOPE_IDENTITY() вернет значение NULL, если функция была вызвана до того, как какая-либо инструкция INSERT была выполнена для столбца идентификаторов в этой области..."


 
Anatoly Podgoretsky ©   (2008-09-08 08:35) [6]

> kaif  (08.09.2008 0:49:00)  [0]

Читаешь BOL по теме @@IDENTITY и смотришь See ALso по двум другим фунциям из данного раздела, затем выбираешь нужную.


 
Медвежонок Пятачок ©   (2008-09-08 09:07) [7]

на 2005 вообще есть ретурн параметры после инсерта/апдейта. но это скорее для "на клиенте"


 
sniknik ©   (2008-09-08 11:27) [8]

> Это как? Он что, палочками пользуется?
внутривенно.



Страницы: 1 вся ветка

Текущий архив: 2009.05.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
15-1237197118
Немо2
2009-03-16 12:51
2009.05.17
Что имеется ввиду?


15-1237360764
немо2
2009-03-18 10:19
2009.05.17
MSSQL2000 и Query Analyzer и управление изоляцией


15-1237316945
Вот в чем вопрос
2009-03-17 22:09
2009.05.17
Перегрузка операторов


2-1232978119
anton shestakov
2009-01-26 16:55
2009.05.17
Фильтрация в базе


15-1237120041
Юрий Зотов
2009-03-15 15:27
2009.05.17
Почтовый клиент перестал работать на отправку...