SQL SERVER IDENTITY MİMARİSİ

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.

USE [SQLTURKIYE];
GO

CREATE TABLE IDENTITY_SQLTR
    (
      ID INT IDENTITY(1, 1) ,
      Name VARCHAR(50) ,
      SurName VARCHAR(50) ,
      Phone_Number CHAR(11)
    );

INSERT  INTO IDENTITY_SQLTR
VALUES  ( 'Yusuf', 'Kahveci', '05000000000' );

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

SELECT  *
FROM    IDENTITY_SQLTR;

 

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 .

-- Test Veritabanımızı Oluşturuyoruz ...
CREATE DATABASE [SQLTURKIYE_IDENTITY];
GO

USE [SQLTURKIYE_IDENTITY];
GO

-- Birinci Test Tablomuzu Oluşturuyoruz...
CREATE TABLE IDENTITY_SQLTR
    (
      ID INT IDENTITY(1, 1) ,
      Name VARCHAR(50) ,
      SurName VARCHAR(50) ,
      Phone_Number CHAR(11)
    );


-- İkinci Test Tablomuzu Oluşturuyoruz...
CREATE TABLE IDENTITY_SQLTR2
    (
      ID INT IDENTITY(1, 1) ,
      EMail VARCHAR(50) ,
      School VARCHAR(50) ,
      Web_Site VARCHAR(50)
    );

-- Üçüncü Test Tablomuzu Oluşturuyoruz...
CREATE TABLE IDENTITY_SQLTR3
    (
      ID INT IDENTITY(1, 1) ,
      Personel_Count INT ,
      CreationDate DATETIME DEFAULT GETDATE()
    );


INSERT  INTO IDENTITY_SQLTR
VALUES  ( 'Yusuf', 'Kahveci', '05000000000' );

-- Birinci Test Tablomuza Veri Basıyoruz
DECLARE @i INT= 1;
WHILE @i < 10
    BEGIN
        INSERT  INTO IDENTITY_SQLTR
        VALUES  ( CAST (@i AS VARCHAR) + 'Yusuf', 'KAHVECİ',
                  '05' + CAST (@i AS VARCHAR) + CAST (@i AS VARCHAR)
                  + '0000000' );
        SET @i = @i + 1;
    END;
GO
SELECT  *
FROM    IDENTITY_SQLTR2;
GO
--İkinci Test Tablomuza Veri Basıyoruz....
DECLARE @i INT= 1;
WHILE @i < 10
    BEGIN
        INSERT  INTO IDENTITY_SQLTR2
        VALUES  ( '[email protected]', 'Üniversite',
                  'www.sqlturkiye.com' );
        SET @i = @i + 1;
    END;
GO
--Birinci Test tablomuz üzerine bir Trigger oluşturuyoruz.
CREATE TRIGGER Personel_Sayısı ON IDENTITY_SQLTR
    FOR INSERT
AS
    BEGIN
--DECLARE @PersonelID INT
--SELECT @PersonelID=MAX(ID) from  IDENTITY_SQLTR
        INSERT  INTO IDENTITY_SQLTR3
                ( Personel_Count ) --SET [email protected]
                SELECT  MAX(ID)
                FROM    IDENTITY_SQLTR;
    END;
GO
--Yukarıda ki Scripti çalıştırarak test ortamımızı oluşturuyoruz. Son olarak ise aşağıda ki Script ile ID değerlerimize erişiyoruz.
-- Aşağıda ki Scripti çalıştırıp sonucu karşılatırıyoruz.
INSERT  INTO IDENTITY_SQLTR2
VALUES  ( '[email protected]', 'Üniversite', 'www.sqlturkiye.com' );

INSERT  INTO IDENTITY_SQLTR
VALUES  ( 'Yusuf', 'Kahveci', '05999999999' );


SELECT  IDENT_CURRENT('IDENTITY_SQLTR') AS 'IDENT_CURRENT Fonksiyonu';

SELECT  SCOPE_IDENTITY() AS 'SCOPE_IDENTITY Fonksiyonu';

SELECT  @@IDENTITY AS '@@IDENTITY Fonksiyonu';

 

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 *