23 Mart 2016 Çarşamba

SQL Server'da Otomatik Artan Identity kolonunda 1000'li artış / SQL Server Auto Identity Column Value Jump Issue

Merhabalar

Otomatik artan identity kolonlarını hepimiz sıklıkla veritabanı tablolarında kullanmaktayız. Fakat herhangi bir silme veya rollback işlemi yapmadığım halde id nin 1000 arttığını gördüm. Nedenini biraz araştırdıktan sonra faydalı bir makaleye rastladım ve problemin benden kaynaklanmadığını anladım. Bu durum eğer veri tipi bigint ise 10000 artış göstermekte.

Durum Nasıl Gerçekleşiyor? 

Tabloya bir kaç kayıt girip, sql'i restart ettikten sonra gerçekleşmekte.


Bu Gerçekten Bir Bug'mı? 

Microsoft'un açıklamasına göre bu bir bug'dan ziyade bir ÖZELLİK. Bunu yapmalarının bir çok sebebi var. 2012 öncesinde böyle bir durum yok. Zaten int veya bigint yeterince büyük. Identity kolonu unique yani tekil olmayı garanti eder. Sıralı artışı değil! Fakat bu yine de bazıları için kabul edilebilir bir durum değil!

Ne Yapmalı ? 

Eğer bu ÖZELLİKLE ilgilenmiyorsak... 

  • Sequence kullanmalı. veya
  • Başlangıç parametresi olarak Sql'e -t272 verilmeli 


Tüm tablolarınızdan otomatik artan identity alanlarını kaldırın.


CREATE SEQUENCE Id_Sequence
    AS INT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 0
    NO MAXVALUE
   NO CACHE


insert into MyTestTable values(NEXT VALUE FOR Id_Sequence, 'Mr.Tom'); 


insert into MyTestTable values(NEXT VALUE FOR Id_Sequence, 'Mr.Jackson'); 

SQLServer configuration manager açın, instance 'ı bulun ve sağ tıklayıp özelliklere girin. Startup Parameters (Başlangıç Parametreleri) sekmesine gelin ve buraya -t272 değerini yazın. Sql'i tekrar başlatın. Farkı göreceksiniz.

Eğer mevcut bir veritabanınız ve idleriniz var ise bunlardan vazgeçmek zor olacağı için Başlangıç parametresi verme yöntemi tercih edilebilir. Yeni bir db oluşturuyorsanız kendi sequence tablonuzu oluşturmanız tercih edilebilir. İnternette Identity kullanmanın avantaj ve dezavantajları hakkında detaylı makaleler bulabilirsiniz.

Kaynak : http://www.codeproject.com/Tips/668042/SQL-Server-Auto-Identity-Column-Value-Jump-Is