ASP.NET
Network Akademi

Met Hostimg

“Bilgi paylaşıldıkça artar” sloganı ile .NET Platformuna ilişkin birikimlerin paylaşıldığı ASP.NET.TR Topluluğunda sizde “YAZAR” olmak için ; info@asp.net.tr e-mail adresine kendinizi anlatan bir e-mail göndererek başvuruda bulunabilirsiniz.

@@IDENTITY, SCOPE_IDENTITY() ve IDENT_CURRENT Kullanımı

Onur YILMAZ
SQL
07.10.2011 15:57:00
Hit : 2194

 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.

 




BU İÇERİĞE YORUMDA BULUNUN


Bu MAKALE'ye yorum yapabilmek için Üye olmalısınız ...!


BU İÇERİĞE YAPILAN YORUMLAR