SQL SERVER IDENTITY MİMARİSİ

Reading Time: 3 minutes

Veritabanlarımızı tasarlarken veritabanında sütunlara atadığımız very tiplerinin yanında bu kolonlara özelliklerde atayabiliyoruz. Çok kullanılan bu özelliklerin başında IDENTITIY özelliği gelmektedir.

IDENTITIY olarak adlandırdığımız sutunlar otomatik artan sutunlardır. SQL Server da bir alana bu özellik tanımlandığında , ilgili tabloya bir kayıt eklendiğinde IDENTITIY olarak belirlediğimiz sutun otomatik olarak artacaktır. Bu sutunda ki ilk numaraya IDENTITY SEED adı verilir. Genel olarak birden başlayarak birer birer artarak devam eder. Bu kolonun artış miktarı ve başlangıç değeri değiştirilebilir. IDENTITY SEED başlangıç miktarını belirtirken IDENTITY INCREMENT ise artım miktarını göstermektedir.

 

Bu özellik ID olarak tanımlayacağımız sutunlar için kullanılır.  Bu tablolara INSERT işlemi yapıldığında o satırın ID değerini öğrenmek isteriz. Peki bu durumda ne yapmalıyız ?

Bu değeri öğrenmek için SQL Server bize üç adet fonksiyon sunmaktadır.

  1. IDENT_CURRENT
  2. SCOPE_IDENTITY()
  3. @@IDENTITY

Yukarıda fonksiyonları kullanarak ID değerlerimizi almaya başlamadan önce Test tablomuzu aşağıda ki script ile oluşturuyoruz.

Tablomuza SELECT çekerek içerisinde ki datalarımızı control ediyoruz.

 

1

Tablomuzun içerisinde bir adet kayıdımız mevcut ve kayıdımızı girdiğimizde ID kolonuna otomatik olarak kayıt atılmış durumdadır. Tablomuzu tasarlarken ID kolonuna IDENTITY (1,1) özelliği atanmıştır yani başlangıç değeri (IDENTITY SEED ) 1, artış değeri ( IDENTITY INCREMENT ) 1 olarak atanmıştır. Özet olarak başlangıç değeri 1 olan kolonumuzun her kayıtta birer birer artışı sağlanmıştır.

SQL Server ‘ın bize sağladığı 3 fonksiyonu kullanarak bu ID değerine nasıl erişebiliriz bunları adım adım görelim.

  1. IDENT_CURRENT : Bu fonksiyon belirttiğimiz tablo üzerinde oluşan son IDENTITY değerini bize vermektedir. Bu fonksiyon session veya kapsamdan bağımsız öğrenmek istediğimiz tablonun IDENTITY değerini bize vermektedir.

Yani bir tablo üzerine bir INSERT işlemi uygulayıp IDENT_CURRENT gerçekleştirene kadar başka session lardan gelen INSERT işlemleri araya gireceğinden dolayı kullanıcının istediği Id dönmez.

Syntax : SELECTIDNET_CURRENT (‘Tablo_Adı’)

  1. SCOPE_IDENTITY : Bu fonksiyon açılmış oturum ile sınırlı olup , sorgulandıkları oturum dahilinde üretilmiş son kimlik değerlerini döndürürler. SCOPE_IDENTITY fonksiyonu sadece işlem etki alanı dahilinde üretilmiş son kimlik değerini döndürür.

Syntax : SELECTSCOPE_IDENTITY()

  1. @@IDENTITY : Bu fonksiyon SCOPE_IDENTITY fonksiyonu gibi açılmış oturum ile sınırlı olmaktadır. Fakat SCOPE_IDENTITY işlem etki alanı dahilinde üretilmiş son kimlik değerini döndürürken, @@IDENTITY fonksiyonu işlem etki alanı ile sınırlı değildir.

Syntax : [email protected]@IDENTITY

 

Aralarında ki fark ise Scope_Identity işlemin yapıldığı kapsam için geçerliyken @@Identity bahsi geçen session ın tamamında gerçekleşmektedir.

O an gerçekleştirdiğimiz transaction ‘ımızda Trigger (tetikleyici) kullanıyor isek bize döndürdüğü değer sağlıklı olmayabilir.

Örneklerimize geçecek olursak .

 

2

Yukarıda da görüldüğü üzere SCOPE_IDENTITY etki alanı içerisinde ki değeri döndürürken @@IDENTITY etki alanı dışında davrandığı için Trigger ‘ın diğer tabloya bastığı verinin IDENTITY değerini döndürmektedir.

Teşekkürler ….

İyi Çalışmalar.

 

Leave a Reply

Your email address will not be published. Required fields are marked *