Merhaba arkadaşlar, bu makalede SQL’de tablolarımıza yeni kayıt eklediğimizde eklediğimiz kaydın Id’sini nasıl alabileceğimizden bahsetmek istiyorum.
Bu işlemi gerçekleştirebilmek için 3 farklı anahtar kelimemiz var.Bunlar @@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT.
Kullanımları ile ilgili aşağıdaki örnek SQL scriptini uygulayabiliriz.
--Test Veritabanımızı oluşturuyoruz.
CREATE DATABASE Test
--Urun Tablomuzu oluşturuyoruz.
CREATE TABLE Urun
(
UrunId INT IDENTITY(1,1) NOT NULL,
UrunAdi NVARCHAR(50) NULL,
UrunKodu NVARCHAR(50) NULL,
AktifMi BIT NULL
)
--Urun tablosunda yapılan işlemlerin loglarını
--tutacağımız UrunLog tablosunu oluşturuyoruz.
CREATE TABLE UrunLog
(
UrunLogId INT IDENTITY(1,1) NOT NULL,
UrunLogDate DATETIME NULL,
UrunId INT NULL,
UrunAdi NVARCHAR(50) NULL,
UrunKodu NVARCHAR(50) NULL,
AktifMi BIT NULL
)
--Urun tablomuzda yapılan değişiklikleri
--UrunLog tablosuna kayıt etmek için Trigger'ımızı oluşturuyoruz.
CREATE TRIGGER Trigger_Urun ON Urun
AFTER INSERT,UPDATE
AS
BEGIN
INSERT INTO UrunLog
SELECT GETDATE(), --UrunLog tablosunda UrunLogDate alanı için
* --UrunLog tablomuzdaki diger bütün alanlar Urun tablomuzdaki ile aynı olduğu için
--* ile hepsini çekiyoruz.
FROM INSERTED
END
--Kullanacağımız Parametreleri Tanımlıyoruz.
DECLARE @pCurrentId INT
DECLARE @pCurrentIdScope INT
DECLARE @pCurrentIdIdent INT
--Urun tablomuza bir kayıt ekliyoruz.
INSERT Urun
VALUES ('Gofret','Gfrt',1)
--Eklediğimiz kayıtın Id'sini parametrelerimize set ediyoruz.
SET @pCurrentId = @@IDENTITY
--@@IDENTITY Tüm Alanlarda etkilidir.Eğer işlem yaptığımız tabloya ait bir
--trigger var ise bu trigger'ın işlem yaptığı tablonun son Id'sini döndürür.
SET @pCurrentIdScope = SCOPE_IDENTITY()
--SCOPE_IDENTITY() Sadece işlem yapılan tablo üzerinde etkisi vardır.
--Dolayısı ile işlem yaptığımız tablonun Id'sini getirir.
SET @pCurrentIdIdent = IDENT_CURRENT('Urun')
--IDENT_CURRENT Etki alanı tanımlana alan için geçerlidir.
--Parametrelerimize set ettiğimiz değeri kontrol ediyoruz.
SELECT @pCurrentId AS UrunId
SELECT @pCurrentIdScope AS UrunIdScope
SELECT @pCurrentIdIdent AS UrunIdIdentCurrent
--Tablomuza eklediğimiz son urunun Idsini tablodan kontrol ediyoruz.
SELECT TOP(1)*
FROM Urun
ORDER BY UrunId desc
--Tablomuza eklediğimiz son urunun Idsini tablodan kontrol ediyoruz.
SELECT TOP(1)*
FROM UrunLog
ORDER BY UrunLogId desc
Gelen sonuç aşağıdaki gibidir.
Henüz Urun ve UrunLog tablolarımızın Idleri eşit gittiği için tüm parametrelerimizin değerleri aynı geliyor.
--Trigger'ı Disable Ediyoruz ve daha sonra tekrar aynı işlemleri gerçekliyoruz
DISABLE TRIGGER Trigger_Urun ON Urun
Gelen sonuç aşağıdaki gibidir.
Trigger'ımızı disable ettik fakat hala Urun ve UrunLog tablolarımızın Idleri eşit gittiği için tüm parametrelerimizin değerleri aynı geliyor.
--Trigger'ı Enable Ediyoruz ve daha sonra tekrar aynı işlemleri gerçekliyoruz
ENABLE TRIGGER Trigger_Urun ON Urun
İşte bu noktada @@IDENTITY ile aldığımız değeri set ettiğimiz parametremiz değişiklik gösteriyor.
Çünkü @@IDENTITY trigger'ın etkilediği UrunLog tablosunun son Id'sini aldı.
Önemli Not : Eğer ki işlem yaptığımız tablo üzerinde Identity verilmiş bir alan yok ise tüm anahtar kelimelerimiz NULL döner.
Bir başka makalede görüşmek dileği ile.
İyi günler dilerim.