@@IDENTITY vs SCOPE_IDENTITY() (Ami a Technetről lemaradt)

A tegnapi Technet SQL üzemeltetői konferencián egy vödör fontos dolog kimaradt az előadásból, idő és szervezettségem hiányában.Ezeket szépen sorban meg fogom majd itt írni, valahol elsz hozzá kis demó is – vagy itt, vagy a Technet portálon.
Az első a listán azon gondolatom kifejtése, hogy a @@IDENTITY legépelésekor sokszor a fejlesztő a SCOPE_IDENTITY() függvényt kívánta használni, csak nem ismerte. Miért gondolom ezt? Mert a @@IDENTITY a sessionben legutoljára letépett identity értéket adja vissza, míg a SCOPE_IDENTITY() csak az adott scope-ban tevékenykedik, azaz legfontosabb vívmányként nem foglalkozik a triggerekkel meg efféle bohóságokkal, az általuk húzott sorszámokat ignorálja. Amikor az identity oszlop értékét beszúrás után idegen kulcsként szeretné használni a fejlesztő, akkor ez a különbség fontos lehet. De inkább nézzünk egy példát: Készítsünk egy táblát, amiben felhasználók vannak nyilvántartva.

USE tempdb

CREATE TABLE Alap (
	userid int identity(10000,1),
	username nvarchar(20) not null
	)
-- szúrjunk is be egyet
INSERT INTO Alap VALUES('Erik')
SELECT @@IDENTITY, SCOPE_IDENTITY()

Az eredmény nem meglepő: 10000 és 10000.
Most döntsünk úgy, hogy naplózni akarjuk a táblába való beszúrásokat:

-- a naplótábla...
CREATE TABLE Naplo (
	naploid int identity(1,1),
	uj_username nvarchar(20),
	felhasznalo varchar(128),
	ido datetime
	)
GO
-- ...és a trigger
CREATE TRIGGER Figyelunk ON Alap
FOR INSERT
AS 
	INSERT INTO Naplo
	SELECT username, suser_name(), getdate() from inserted

-- és most szúrjunk be még egyet:

INSERT INTO Alap VALUES('Erik')
SELECT @@IDENTITY, SCOPE_IDENTITY()

Az eredmény a nem meglepő 1 és 10001. Mi történt? A @@IDENTITY visszaadta a legutolsó letépett sorszámot, a napló tábla 1-ét, hiszen a fent iegy insert parancs hatására tulajdonképpen két insert hajtódott végre: egy olyan, amit mi akartunk, és egy olyan, amit a trigger akart. A SCOPE_IDENTITY() viszont csak a mi parancsunkat vette figyelembe, a triggert ignorálta.
Ezek után mindenki maga eldöntheti, hogy mikor melyiket szeretné használni.

Leave a comment