SQL Server 2016 System-Versioned Table

Reading Time: 3 minutes

SQL Server 2016 ile hayatımıza giren bir diğer özellikde system-versioned table yani Temporal Teble dır. Bu özellik sayesinde tablomuz üzerinde ki DML değişikliklerini otomatik olarak izlenebilir ve  ve izleme sonucunda oluşan değişiklikler aynı yapıya sahip başka bir tabloda loglanır. System-versioned tablosunda her bir kayıt için kayıdın geçerlilik periyodunu başlangıç ve bitiş tarihini belirten DATETIME2 tipinde iki tane kolon bulunmaktadır. Bu kolonlar ile tablomuzda herhangi bir değişiklik yapıldığında bu alanlarda gerekli düzenlemeler yapılarak kayıtlog tablomuza taşınacaktır.

CREATE TABLE <Table_Name>

(

Column_Name_1 DataType,

Column_Name_2 DataType,

Column_Name_3 DataType,

Column_Name_4 DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,

Column_Name_5 DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,

PERIOD FOR SYSTEM_TIME (Column_Name_4, Column_Name_5)) WITH(SYSTEM_VERSIONING = ON);

Syntax ‘ımızı incelediğimiz de var olan tablo yapımızda iki adet DATETIME 2 tipinde kolon bulunmakta ve tablomuza kayıt eklerken SQL Server ‘ın bizim yerimize değer atadığı kolonlardır. PERIOD FOR SYSTEM_TIME  İfadesi ile system-versioned table için kullanılacak kolonların isimlerini belirtiyoruz ve bu şekilde verisyonlamanın hangi kolonlar üzerinden yapılacağını SQL Server ‘a bildirmiş oluyoruz. Bu sayede History tablosuna taşıyacağı kayıdı belirtmiş oluyoruz.  SYSTEM_VERSIONING = ON İfadesi ile de bu  özelliği açıp açmayacağımız SET ediyoruz. On ise artık system-versioned table olarak tablomuz hayatına devam ediyor olacak. Canlı örneğe geçecek olur isek ;

Yukarıd aki script ile tablomuzu oluşturup System-Versioned olduğunu da SysStartTime ve SysEndTime kolonları ile de belirtip aktif hale getiriyoruz.

Yukarıda da gördüğünüz üzere diğer tablolardan farklı olarak üzerinde saat işareti bulunmakta oluşturduğumuz tablonun. + ya basıp içeirisne baktığımızda History tablosunuda görmekteyiz.

Peki tablomuza data girişi yapalım.

Tablomuza data  girişi yaptıktan sonra SELECT çekerek datamızı kontrol edelim ;

SysStartTime kolonu incelendiğinde işlemin başladığı tarih değeri atanırken , SysEndTime değeri ise datetime2 veri tipinin maksimum değeri olan 9999-12-31 23:59:59.9999999 olarak atanmaktadır.

 

Tablomuz üzerinde 65432896471  TC kimlik No lu kayıdı silelim ;

Daha sonra hem ana tablomuza hemde History tablomuza SELECT çekelim.

Gördüğünüz üzere ana tablomuzdan kayıdımız silinmiş ve History tablomuza baktığımızda da sildiğimiz kayıdın loglandığını görmekteyiz. Burada dikkat etmeniz gereken nokta silinmeden SysEndTime ‘ı  datetime2 nin max değeri iken history tablosuna loglandıktan sonra DELETE gördüğü yani history e atıldığı tarih olarak güncellenmiş SysEndtime kolonu. SysStartTime kolonu ise ilk işlem tarihini hala tutmakta.

UPDATE işlemi yapalım ana tablomuzda ve süreci tekrar izleyelim ;

Tablolarımızı kontrol edelim ;

Gördüğünüz üzere  güncelleme işlemi yapılan kayıtta ana tabloda SysStartTime değeri en son güncelleme yapıldığı tarihi alırken, History tablosunda aynı değer SysEndTime kolonuna SET edilmiş durumda. Yani DELETE ifadesinden daha farklı UPDATE süreci. Kısaca UPDATE sürecinde UPDATE edilen tarih ana tablo da SysStartTime ve History tablosunda SysEndTime kolonlarında güncellenmekte.

Tablomuzu DROP edelim ;

Tablomuzu DROP etmek isterken yukarıda ki hata mesajını bize döndürdü. Tablo system-versioned olduğu için o özelliği pasif yapmadan DROP işlemi yapamayacağını aktarıyor.

Peki system-versioned özelliği açık olan tabloda bu özelliği nasıl kapatırız ?

Yukarıdaki script ile system-versioned özelliğini OFF a çekerek tablomuzu bu işlemden sonra DROP edebiliriz.

DB içerisinde yer alan bir tabloda bu özelliği açmak için ise ;

Scripti incelediğimizde SYSTEM_VERSIONIN=ON ifadesi ile Temporal table hale dönüştür diyoruz ve HISTORY_TABLE ifadesinde de HISTORY tablomuzun ismini verip veri bütünlüğünüde Check ettirip özelliği aktif hale getiriyoruz.

Leave a Reply

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