“Bu müşterinin adresi geçen ay neydi?”
Normal bir tabloda UPDATE eski değeri siler. Geçmişi saklamanın yolları:
| Yöntem | Ne saklar? | Kullanım |
|---|---|---|
| Temporal (system-versioned) tablo | Her satırın tüm eski sürümleri, geçerlilik aralıklarıyla | Geçmişe dönük sorgu, denetim, yanlışlıkla güncellemeyi geri alma |
| Change Data Capture (CDC) | Değişen satırların önceki/sonraki değerleri (günlükten okunur) | Veri ambarına artımlı aktarım |
| Change Tracking | Yalnızca hangi satırın değiştiği | Hafif eşitleme (mobil uygulama vb.) |
| Ledger tablo | Kriptografik olarak doğrulanabilir değişiklik geçmişi | Değiştirilemezlik kanıtı gereken kayıtlar |
-- Temporal tablo
CREATE TABLE dbo.fiyat (
product_id INT PRIMARY KEY,
price DECIMAL(12,2) NOT NULL,
gecerli_baslangic DATETIME2 GENERATED ALWAYS AS ROW START,
gecerli_bitis DATETIME2 GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (gecerli_baslangic, gecerli_bitis)
) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.fiyat_gecmis));
-- 1 Aralık 2024'teki fiyatlar
SELECT product_id, price
FROM dbo.fiyat FOR SYSTEM_TIME AS OF '2024-12-01';
-- Bir ürünün tüm fiyat geçmişi
SELECT price, gecerli_baslangic, gecerli_bitis
FROM dbo.fiyat FOR SYSTEM_TIME ALL
WHERE product_id = 5
ORDER BY gecerli_baslangic;
-- CDC'yi açmak
EXEC sys.sp_cdc_enable_db;
EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'orders', @role_name = NULL;
Diğer SQL türleri: Oracle'da Flashback Query (AS OF TIMESTAMP), MariaDB'de system-versioned tablolar, BigQuery'de FOR SYSTEM_TIME AS OF (son 7 gün), PostgreSQL'de eklenti veya trigger tabanlı geçmiş tabloları. Veri ambarında aynı ihtiyaç SCD Tip 2 ile karşılanır.