Aracılığıyla paylaş


Zaman-süreç tabloları

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri Microsoft Fabric'te Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiSQL veritabanı

Zamana bağlı tablolar (sistem sürümü oluşturulmuş zamana bağlı tablolar olarak da bilinir), yalnızca o anda doğru olan veriler yerine herhangi bir zamanda tabloda depolanan veriler hakkında bilgi sağlamaya yönelik yerleşik destek sağlayan bir veritabanı özelliğidir.

sistem sürümüne sahip zamana bağlı tabloları kullanmaya başlayın ve Zamansal tablo kullanım senaryolarını gözden geçirin.

Sistem sürümlü zamansal tablo nedir?

Sistem sürümüne sahip bir zamana bağlı tablo, veri değişikliklerinin tam geçmişini tutmak için tasarlanmış bir kullanıcı tablosu türüdür ve bu sayede zaman içinde kolayca analiz edilir. Sistem, her satırın geçerlilik süresini yönettiğinden (yani, Veritabanı Motoru), bu tür bir zamana bağlı tabloya sistem sürümlü zamana bağlı tablo denir.

Her zamansal tabloda, her birinin datetime2 veri türüne sahip iki açık tanımlı sütunu vardır. Bu sütunlar dönem sütunları olarak adlandırılır. Bu dönem sütunları, bir satır değiştirildiğinde her satır için geçerlilik süresini kaydetmek için sistem tarafından özel olarak kullanılır. Geçerli verileri depolayan ana tablo, geçerli tablo olarak veya zamansal tablo olarak adlandırılır.

Bu dönem sütunlarına ek olarak, zamansal tablo da geçmiş tablosu olarak adlandırılan yansıtılmış şemaya sahip başka bir tabloya başvuru içerir. Sistem, geçmiş tablosundaki bir satır her güncelleştirildiğinde veya silindiğinde satırın önceki sürümünü otomatik olarak depolamak için geçmiş tablosunu kullanır. Zamansal tablo oluşturma sırasında, mevcut bir geçmiş tablosu (şema uyumlu olmalıdır) belirtebilir veya sistemin varsayılan bir geçmiş tablosu oluşturmasına izin vekleyebilirsiniz.

Neden zamana bağlı?

Gerçek veri kaynakları dinamiktir ve iş kararları genellikle analistlerin veri evriminden elde edebileceği içgörülere dayanır. Zamana bağlı tablolar için kullanım örnekleri şunlardır:

  • Tüm veri değişikliklerini denetleme ve gerektiğinde veri adli incelemeleri gerçekleştirme
  • Geçmişte herhangi bir zamanda verilerin durumunu yeniden oluşturma
  • Zaman içindeki eğilimleri hesaplama
  • Karar destek uygulamaları için yavaş değişen bir boyutu sürdürme
  • Yanlışlıkla yapılan veri değişikliklerinden ve uygulama hatalarından kurtarma

Zamana bağlı nasıl çalışır?

Bir tablo için sistem sürümleme, birbirine bağlı iki tablo olarak uygulanır: güncel tablo ve geçmiş tablosu. Bu tabloların her birinde, her satır için geçerlilik süresini tanımlamak için iki ek datetime2 sütunu kullanılır:

  • Dönem başlangıç sütunu: Sistem, bu sütundaki satırın başlangıç saatini kaydeder ve genellikle ValidFrom sütunu olarak belirtilir.

  • Dönem bitiş sütunu: Sistem, bu sütundaki satırın bitiş saatini kaydeder ve genellikle ValidTo sütun olarak belirtilir.

Geçerli tablo, her satır için geçerli değeri içerir. Geçmiş tablosu, varsa her satır için önceki her değeri (eski sürüm) ve geçerli olduğu dönemin başlangıç saatini ve bitiş saatini içerir.

Zamansal tablonun nasıl çalıştığını gösteren diyagram.

Aşağıdaki senaryo, çalışan bilgilerini içeren bir durumu temsil eder:

CREATE TABLE dbo.Employee (
    [EmployeeID] INT NOT NULL PRIMARY KEY CLUSTERED,
    [Name] NVARCHAR(100) NOT NULL,
    [Position] VARCHAR(100) NOT NULL,
    [Department] VARCHAR(100) NOT NULL,
    [Address] NVARCHAR(1024) NOT NULL,
    [AnnualSalary] DECIMAL(10, 2) NOT NULL,
    [ValidFrom] DATETIME2 GENERATED ALWAYS AS ROW START,
    [ValidTo] DATETIME2 GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME(ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));

Daha fazla bilgi için bkz. Sistem sürümüne sahip bir zamana bağlı tablo oluşturma.

  • Ekler: Sistem, ValidFrom sütununun değerini sistem saatini temel alarak geçerli işlemin başlangıç zamanına (UTC saat diliminde) ayarlar ve ValidTo sütununun değerini 9999-12-31en büyük değerine atar. Bu, satırı açık olarak işaretler.

  • Güncelleştirmeleri: Sistem, geçmiş tablosundaki satırın önceki değerini depolar ve ValidTo sütununun değerini sistem saatini temel alarak geçerli işlemin başlangıç zamanına (UTC saat diliminde) ayarlar. Bu, satırı kapalı olarak işaretler ve satırın geçerli olduğu dönemi kaydeder. Geçerli tabloda satır yeni değeriyle güncelleştirilir ve sistem, ValidFrom sütununun değerini sistem saatini temel alarak işlemin başlangıç zamanına (UTC saat diliminde) ayarlar. ValidTo sütunu için geçerli tablodaki güncelleştirilmiş satırın değeri 9999-12-31en büyük değeri olarak kalır.

  • Silme sayısı: Sistem, geçmiş tablosundaki satırın önceki değerini depolar ve ValidTo sütununun değerini sistem saatini temel alarak geçerli işlemin başlangıç zamanına (UTC saat diliminde) ayarlar. Bu, satırı kapalı olarak işaretler ve önceki satırın geçerli olduğu zaman aralığını kaydeder. Mevcut tabloda satır kaldırıldı. Geçerli tablonun sorguları bu satırı döndürmez. Yalnızca geçmiş verileriyle ilgilenen sorgular, satırın kapatıldığı verileri döndürür.

  • Birleştirme: İşlem, MERGE deyiminde eylem olarak belirtilenlere bağlı olarak, tam olarak üç deyime kadar (INSERT, UPDATEve/veya DELETE) yürütülmüş gibi davranır.

Sistem datetime2 sütunlarında kaydedilen saatler, işlemin başlangıç saatini temel alır. Örneğin, tek bir işlem içine eklenen tüm satırların, SYSTEM_TIME döneminin başlangıcına karşılık gelen sütuna aynı UTC saati kaydedilir.

Zamansal tabloda veri değiştirme sorguları çalıştırdığınızda, sütun değeri değişmese bile Veritabanı Altyapısı geçmiş tablosuna bir satır ekler.

Zamana bağlı verileri nasıl sorgularım?

SELECT ... FROM <table> deyimi, mevcut ve geçmiş tablolardaki verileri sorgulamak için zamansal özellikli beş alt tümce içeren FOR SYSTEM_TIMEyeni bir maddeye sahiptir. Bu yeni SELECT deyimi söz dizimi doğrudan tek bir tabloda desteklenir, birden çok birleşim aracılığıyla ve birden çok zamansal tablonun üzerindeki görünümler aracılığıyla yayılır.

Beş alt başlıktan birini kullanarak FOR SYSTEM_TIME yan tümcesini kullanarak sorguladığınızda, aşağıdaki görüntüde gösterildiği gibi zamansal tablodaki geçmiş verileri eklenir.

ZamanSal Sorgulamanın nasıl çalıştığını gösteren diyagram.

Aşağıdaki sorgu, en az bir bölümü 1 Ocak 2021 ile 1 Ocak 2022 (üst sınır dahil) arasındaki dönemde etkin olan, filtre koşulu WHERE EmployeeID = 1000'e uyan bir çalışana ait satır sürümlerini arar.

SELECT * FROM Employee
    FOR SYSTEM_TIME
        BETWEEN '2021-01-01 00:00:00.0000000' AND '2022-01-01 00:00:00.0000000'
            WHERE EmployeeID = 1000 ORDER BY ValidFrom;

FOR SYSTEM_TIME, geçerlilik süresi sıfır olan satırları filtreler (ValidFrom = ValidTo).

Aynı işlem içinde aynı birincil anahtar üzerinde birden çok güncelleştirme gerçekleştirirseniz bu satırlar oluşturulur. Bu durumda, zamana bağlı sorgulama yalnızca işlemlerden önceki satır sürümlerini ve işlemlerden sonraki geçerli satırları döndürür.

Bu satırları çözümlemeye eklemeniz gerekiyorsa, geçmiş tablosunu doğrudan sorgula.

Aşağıdaki tabloda, Uygun satırlar sütunundaki ValidFrom sorgulanan tablonun ValidFrom sütunundaki değeri temsil eder ve ValidTo sorgulanan tablonun ValidTo sütunundaki değeri temsil eder. Söz diziminin tamamı ve örnekler için, FROM yan tümcesi artı JOIN, APPLY, PIVOTve sistem sürümlü bir zamansal tablodaki verileri sorgulamabölümüne bakın.

İfade Şartları sağlayan satırlar Not
AS OF date_time ValidFrom <= date_timeAND ValidTo >date_time Geçmişte belirtilen zaman noktasında geçerli olan değerleri içeren satırları içeren bir tablo döndürür. Dahili olarak, zamana bağlı tablo ile geçmiş tablosu arasında bir birleşim gerçekleştirilir. Sonuçlar, date_time parametresi tarafından belirtilen zaman noktasında geçerli olan satırdaki değerleri döndürecek şekilde filtrelenir. bir satırın değeri, system_start_time_column_name değeri date_time parametre değerinden küçük veya buna eşitse ve system_end_time_column_name değeri date_time parametre değerinden büyükse geçerli kabul edilir.
FROM start_date_timeTOend_date_time ValidFrom < bitiş_tarihi_saatiAND ValidTo >başlangıç_tarihi_saati FROM bağımsız değişkeninin start_date_time parametre değerinden önce etkin olmaya başlamasına veya TO bağımsız değişkeninin end_date_time parametre değerinden sonra etkin olmayı durdurmalarına bakılmaksızın, belirtilen zaman aralığında etkin olan tüm satır sürümlerinin değerlerini içeren bir tablo döndürür. Dahili olarak, zamana bağlı tablo ile geçmiş tablosu arasında bir birleşim gerçekleştirilir. Sonuçlar, belirtilen zaman aralığında herhangi bir zamanda etkin olan tüm satır sürümlerinin değerlerini döndürecek şekilde filtrelenir. tam olarak FROM uç noktası tarafından tanımlanan alt sınırda etkin olmayı durduran satırlar dahil değildir ve tam olarak TO uç noktası tarafından tanımlanan üst sınırda etkin hale gelen kayıtlar da dahil değildir.
BETWEEN start_date_timeANDend_date_time ValidFrom <= end_date_timeAND ValidTo >start_date_time döndürülen satır tablosu, end_date_time uç noktası tarafından tanımlanan üst sınırda etkin hale gelen satırları içermesi dışında, FOR SYSTEM_TIME FROMstart_date_timeTOend_date_time açıklamasında öncekiyle aynıdır.
CONTAINED IN (start_date_time, end_date_time) ValidFrom >= start_date_timeAND ValidTo <=end_date_time CONTAINED IN bağımsız değişkeni için iki dönem değeri tarafından tanımlanan belirtilen zaman aralığında açılmış ve kapatılmış tüm satır sürümleri için değerleri içeren bir tablo döndürür. Tam olarak alt sınırda etkin hale gelen veya tam olarak üst sınırda etkin olmayı durduran satırlar eklenir.
ALL Tüm satırlar Geçerli tabloya ve geçmiş tabloya ait satırların birleşimini döndürür.

Dönem sütunlarını gizle

Dönem sütunlarını gizlemeyi seçebilirsiniz; böylece bunlara açıkça başvurmamış sorgular bu sütunları döndürmez (örneğin, SELECT * FROM <table>çalıştırırken).

Gizli bir sütun döndürmek için sorgudaki gizli sütuna açıkça başvurmanız gerekir. Benzer şekilde INSERT ve BULK INSERT ifadeleri, bu yeni dönem sütunları var olmamış gibi devam eder (ve sütun değerleri otomatik olarak doldurulur).

HIDDEN yan tümcesini kullanma hakkında ayrıntılı bilgi için CREATE TABLE ve ALTER TABLE'ye bakın.

Örnekler