Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.05.17;
Скачать: [xml.tar.bz2];

Вниз

Автоинкрементные поля в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
2-1238854644
denissoft
2009-04-04 18:17
2009.05.17
Драйвера формата sys


2-1238675477
oleg_teacher
2009-04-02 16:31
2009.05.17
Регистр букв


3-1220882616
Кочпхдун Нджумбабаев
2008-09-08 18:03
2009.05.17
TQuery, данные не хотят обновляться :(


2-1238593247
mnj
2009-04-01 17:40
2009.05.17
рисование компонент


15-1237382359
немо2
2009-03-18 16:19
2009.05.17
select min(col1) from tabl1. Работает по 5 минут. MSSQL2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский