MSSQL bir tabloda versiyonlama gerektiğinde bunu trigger ile veya aynı tabloya kayıt/değişiklik tarihiyle yapıyordum. Bu sefer ihtiyacım olduğunda System-Versioned Temporal Table adında, mevcut tablonun altında yer alacak bir tabloyla bunu yapabileceğimi öğrendim. “Günaydınnnn” seslerini duyar gibiyim.
Sistemin mevcut tablonun altına oluşturduğu, karmaşaya sebep olmayan bu HISTORY tablosu validfrom ve validto kolonlarıyla update edilmiş veya delete edilmiş verileri saklıyor. İstediğiniz zaman buradan ulaşabiliyorsunuz geçmiş verilere ve herhangi bir zamanda asıl tablonuzun ne durumda olduğunu görebiliyorsunuz. Örnek olarak bir ay önceki bir zamanda tablo görüntüsünü görebiliyorsunuz.
Peki mevcut bir tabloya history tablosunu nasıl ekliyoruz?
Tablomuzun adı MEVCUTTABLO olsun. Öncelikle Temporal period sütunlarını ekliyoruz.
ALTER TABLE dbo.MEVCUTTABLO
ADD
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL
DEFAULT SYSUTCDATETIME(),
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL
DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999'),
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);
SYSTEM_VERSIONING’i aktif hale getiriyoruz ve yeni oluşturulacak HISTORY tablomuzun ismini istediğimiz gibi yazıyoruz. Ben, MEVCUTTABLOHISTORY olsun diyorum;
ALTER TABLE dbo.MEVCUTTABLO SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.MEVCUTTABLOHISTORY));
Bu aşamadan sonra UPDATE ve INSERT işlemlerinde eski tarihli kayıt saklanacaktır. Örnek olarak bir saat öncesini görmek istersek;
SELECT * FROM dbo.MEVCUTTABLO FOR SYSTEM_TIME AS OF DATEADD(hour, -1, SYSUTCDATETIME());
Kullanım yoğunluğuna göre ara sıra HISTORY tablosundan eski kayıtları silmek faydalı olacaktır.