Реферат: К вопросу об идентификаторах

---- Session 1:

INSERT INTO Ident_table (some_values) VALUES ('value 5')

---- Session 2:

INSERT INTO Ident_table (some_values) VALUES ('value 6')

---- Session 1:

SELECT @@IDENTITY as [Last ID in session]

SELECT * FROM Ident_table

--- результат:

Last ID in session

----------------------------------------

7

(1 row(s) affected)

ID some_values

----------- ----------------------------

... ...

6 value 4

7 value 5

8 value 6

(6 row(s) affected)

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

Для того чтобы избежать таких неприятностей, служит SCOPE_IDENTITY(), который возвращает значение, записанное сервером в автоинкрементный столбец не только в рамках сессии, но и в рамках текущего пакета (batch).

-- ещеоднатабличкасавтоинкрементом

CREATE TABLE Ident2(ID int IDENTITY(0, -2), value varchar(50))

GO

-- триггер на вставку к первоначальной табличке

CREATE TRIGGER IdentTrigger ON Ident_table

FOR INSERT

AS

INSERT INTO Ident2 (value) VALUES(GetDate())

К-во Просмотров: 406
Бесплатно скачать Реферат: К вопросу об идентификаторах