SQL Server 2017, SQL Server’ın önceki sürümlerine kıyasla çok sayıda heyecan verici özellikler ve geliştirmeler sunmaktadır. Identity bir kolona veri eklemesi yaparken SQL Server servisinin kitlenmesi, restart edilmesi gibi durumlarda identity kolon nasıl bir davranış sergileyecek bu yazımızda bu konuyu ele alacağız.
Veritabanı bazında ayar yapmamızı sağlayan SQL Server 2016 ile yaşantımızdaki yerini alan sys.database_scoped_configurations tablosunu SQL Server 2017 ile sorguladığımızda IDENTITY_CACHE özelliğini görebiliriz.
SQL Server 2016 Öncesinde ;
SELECT * FROM sys.database_scoped_configurations
SQL Server 2017 Sonrasında ;
SQL Server 2017’de IDENTITY_CACHE özelliliği Default olarak Açık ( Aktif ) olarak gelmektedir.
İlk olarak bu özelliğin aktif olma durumunu inceleyelim.
CREATE TABLE CaglarOzenc_Demo ( ID INT IDENTITY(1,1), NAME varchar(100) ) GO INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Caglar') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Oguz') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Mehtap') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Betul') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Murat')
Sorgu sonucu için ;
SELECT * FROM dbo.CaglarOzenc_Demo
Şimdi benzer insert işlemini Transaction içerisinde yapmaya çalışalım.
BEGIN TRAN INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Caglar Ozenc') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Oguz Bor') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Mehtap Ozenc') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Cem') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Murat Oguz')
Şimdi SQL Server hizmetini durdurmamız gerekiyor. Bunu iki şekilde yapabiliriz.
1) SQL Server Configuration Manager
2) SHUTDOWN WITH NOWAIT komutunu ile
Biz SHUTDOWN WITH NOWAIT komutu ile SQL Server Servisini durduracağız. Başka bir sorgu pencesinde Transaction ile olan query çalışırken SHUTDOWN WITH NOWAIT yazıp çalıştırıyoruz.
Yukarıdakı sorguyu iki kere çalıştıracak olursak aşağıdaki gibi bir ekran ile karşılaşırız.
İşlem tamamlandığına göre SQL Server Configuration Manager’dan SQL Server Servisini tekrar çalıştırmamız ve oluşturduğumuz tabloya tekrar kayıt girmeyi denemeliyiz.
Şervis çalıştıktan sonra tekrar insert işlemi yapalım.
INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Caglar Ozenc') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Oguz Bor') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Mehtap Ozenc') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Cem') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Murat Oguz')
İşlem sonrasındaki tablomuzun içerisine bakalım.
SELECT* FROM dbo.CaglarOzenc_Demo
Bu gibi durumlar ile karşılaşmamak için SQL Server 2017’de IDENTITY_CACHE özelliğini Kapalı olarak ayarlamamız gerekmektedir. Benzer işlemi IDENTITY_CACHE özelliğini kapatıp tekrar yapalım.
IDENTITY_CACHE özelliğini kapatmak için aşağıdaki kod bloğunu işlemi yapmak istediğimiz veritabanında çalıştırmamız gerekiyor.;
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
IDENTITY_CACHE özelliğinin kapalı olduğunu aşağıdaki sorgu ile görebilirsiiz.
SELECT* FROM sys.database_scoped_configurations WHERE name =’IDENTITY_CACHE’
IDENTITY_CACHE özelliğini devredışı bıraktığımızdan, SQL Server’ın önceki versiyonları gibi davranış gösterecektir.
Testleri tekrar gerçekleştirmek için tabloyu drop edip aynı adımları tekrar gerçekleştirelim.
DROP TABLE CaglarOzenc_Demo GO CREATE TABLE CaglarOzenc_Demo ( ID INT IDENTITY(1,1), NAME varchar(100) )
Tablo tekrar oluşturduk,şimdi insert işlemlerini tekrar yapalım. IDENTITY_CACHE özelliği kapalı!
INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Caglar') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Oguz') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Mehtap') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Betul') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Murat')
Şimdi tekrar bir transaction içerisinde kayıt ekleme işlemi yapalım.
BEGIN TRAN INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Caglar Ozenc') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Oguz Bor') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Mehtap Ozenc') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Cem') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Murat Oguz')
Şimdi kontrolsüz SQL Server servisini durduralım.
SHUTDOWN WITH NOWAIT
SQL Server Servisini tekrar start ediyoruz ve tekrar kayıt ekleyip tabloyu sorguluyoruz.
INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Caglar Ozenc') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Oguz Bor') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Mehtap Ozenc') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Cem') INSERT INTO dbo.CaglarOzenc_Demo(NAME)VALUES('Murat Oguz')
Beklenmedik sunucu kapanmasına rağmen kimlik değerlerinin sırası sürekli olduğunu görebiliriz.Bu özellik ile 272 trace flag’i kullanmak durumuda kalmamış olacağız. 272 Flag nedir diyecek olursanız.Üstad Pinal Dave’e yönlendireyim. Ayrıca bende konu olarak anlatırım.
NOT : IDENTITY_CACHE özelliğini kullanabilmek için TSQL kullanılmalıdır. Herhangi bir GUI seçeneği yoktur.