# Temporal Table (System-Versioned) ile Otomatik Veri Geçmişi

"Bu kayıt ne zaman değişti, önceki değeri neydi?" sorusu veritabanı yönetiminin en sık karşılaşılan sorularından biri. Temporal Table bu soruyu doğrudan yanıtlayan yerleşik bir SQL Server özelliği.

Temporal Table Nedir? SQL Server 2016 ile gelen System-Versioned Temporal Table, bir tablodaki her satırın tüm geçmişini otomatik olarak saklar. Bir satır değiştirildiğinde eski değer sistem tarafından tarih damgasıyla ayrı bir history tablosuna yazılır. Manuel trigger yazmaya gerek yok. CDC kurmaya gerek yok. SQL Server her şeyi otomatik yönetiyor.

Nasıl Oluşturulur? sql-- Temporal table oluşturma CREATE TABLE dbo.UrunFiyatlari ( UrunID INT NOT NULL PRIMARY KEY, UrunAdi NVARCHAR(200) NOT NULL, Fiyat DECIMAL(10,2) NOT NULL, KategoriID INT NOT NULL, -- Sistem sütunları GecerlilikBaslangic DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL, GecerlilikBitis DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM\_TIME (GecerlilikBaslangic, GecerlilikBitis) ) WITH (SYSTEM\_VERSIONING = ON (HISTORY\_TABLE = dbo.UrunFiyatlariGecmis)); Bu kadar. Artık tablodaki her INSERT, UPDATE ve DELETE işlemi otomatik olarak geçmiş tablosuna yazılır.

Geçmişe Sorgu Atmak Temporal Table'ın en güçlü özelliği zaman bazlı sorgulama. sql-- Belirli bir andaki veriyi göster SELECT \* FROM dbo.UrunFiyatlari FOR SYSTEM\_TIME AS OF '2024-06-15 12:00:00';

\-- İki tarih arasındaki tüm değişiklikleri göster SELECT \* FROM dbo.UrunFiyatlari FOR SYSTEM\_TIME BETWEEN '2024-01-01' AND '2024-12-31' ORDER BY UrunID, GecerlilikBaslangic;

\-- Belirli bir ürünün fiyat geçmişi SELECT UrunID, Fiyat, GecerlilikBaslangic AS DegisiklikZamani, GecerlilikBitis AS GecerlilikSonu FROM dbo.UrunFiyatlari FOR SYSTEM\_TIME ALL WHERE UrunID = 42 ORDER BY GecerlilikBaslangic;

Mevcut Tabloya Temporal Özelliği Eklemek sql-- Mevcut tabloya sistem sütunları ekle ALTER TABLE dbo.Musteriler ADD GecerlilikBaslangic DATETIME2 GENERATED ALWAYS AS ROW START CONSTRAINT df\_Musteriler\_Baslangic DEFAULT '2000-01-01 00:00:00.0000000' NOT NULL, GecerlilikBitis DATETIME2 GENERATED ALWAYS AS ROW END CONSTRAINT df\_Musteriler\_Bitis DEFAULT '9999-12-31 23:59:59.9999999' NOT NULL, PERIOD FOR SYSTEM\_TIME (GecerlilikBaslangic, GecerlilikBitis);

\-- System versioning'i aktif et ALTER TABLE dbo.Musteriler SET (SYSTEM\_VERSIONING = ON (HISTORY\_TABLE = dbo.MusterilerGecmis));

Değişiklik Yönetimiyle İlişkisi Temporal Table değişiklik yönetiminin veri katmanını güçlendirir. Kim hangi tabloyu değiştirdi sorusu DDL Trigger ile yanıtlanır. Hangi satır nasıl değişti sorusu ise Temporal Table ile yanıtlanır. İkisi birlikte kullanıldığında hem yapısal hem verisel değişikliklerin tam geçmişi elde edilir.

Dikkat Edilmesi Gerekenler Depolama alanı: Her değişiklik history tablosuna yazıldığından depolama ihtiyacı artar. Büyük ve sık değişen tablolarda bu ciddi boyutlara ulaşabilir. Geçmiş tablosu için uygun bir retention policy tanımlanmalı. Performans etkisi: Her DML işleminde arka planda history tablosuna yazma yapılır. Genellikle kabul edilebilir düzeyde ama yoğun ortamlarda izlenmeli. Temporal table değişikliği: Temporal table'ı değiştirmek (kolon ekleme, silme) sistem versioning'in geçici olarak kapatılmasını gerektirebilir. Bu işlem de değişiklik yönetim sürecine tabi olmalı.

Sonuç Temporal Table, veri geçmişi tutmanın en az maliyetli ve en güvenilir yöntemi. Değişiklik yönetim altyapısının veri katmanına eklenmesi gereken güçlü bir araç. Detaylı bilgi için: sqlchangeguard.com
