Ana içeriğe geç
Kesit SQL
İleri · T-SQL (SQL Server)

Değişiklik geçmişi: temporal tablolar, CDC ve change tracking

Bir satırın geçmişteki halini sorgulamak ve değişiklikleri yakalamak.

Uygulamada aç, 6 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

“Bu müşterinin adresi geçen ay neydi?”

Normal bir tabloda UPDATE eski değeri siler. Geçmişi saklamanın yolları:

YöntemNe saklar?Kullanım
Temporal (system-versioned) tabloHer satırın tüm eski sürümleri, geçerlilik aralıklarıylaGeç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 TrackingYalnızca hangi satırın değiştiğiHafif eşitleme (mobil uygulama vb.)
Ledger tabloKriptografik olarak doğrulanabilir değişiklik geçmişiDeğ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.

Alıştırmalara geç (6)