Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

Temporal Tables

Termin Definicja
Temporal Tables

Temporal Tables to tabele automatycznie zachowujące historię zmian każdego wiersza wraz z okresem jego ważności.

Jak działają Temporal Tables w SQL Server

Temporal Tables, czyli tabele czasowe, to mechanizm systemu SQL Server służący do automatycznego przechowywania kolejnych wersji rekordów. Tabela główna zawiera aktualny stan danych, natomiast tabela historii przechowuje wcześniejsze wersje wierszy wraz z informacją o okresie, w którym dana wersja była obowiązująca. Mechanizm ten jest określany w SQL Server jako system-versioned temporal table.

Każdy wiersz tabeli czasowej korzysta z dwóch kolumn okresu ważności. Są to kolumny typu datetime2, zwykle oznaczane jako czas rozpoczęcia obowiązywania wersji oraz czas jej zakończenia. Kolumny muszą być zadeklarowane jako generowane przez system, na przykład z użyciem GENERATED ALWAYS AS ROW START i GENERATED ALWAYS AS ROW END. SQL Server wypełnia je automatycznie. Dla aktualnej wersji rekordów wartość końca okresu jest ustawiana na maksymalną wartość typu datetime2, czyli 9999-12-31 23:59:59.9999999.

Zmiana rekordu a zapis poprzedniej wersji

Podczas wykonania instrukcji UPDATE SQL Server nie usuwa bezpowrotnie poprzedniej wartości z system-versioned temporal table. Dotychczasowa wersja wiersza zostaje przeniesiona do tabeli historii i otrzymuje końcowy czas obowiązywania. W tabeli głównej zapisywana jest nowa wersja z nowym początkiem okresu ważności. Przy operacji DELETE usuwany rekord również trafia do tabeli historii, dzięki czemu można odtworzyć jego stan sprzed usunięcia. Operacja INSERT tworzy bieżącą wersję w tabeli głównej, bez wcześniejszego wpisu w historii.

Czasy przechowywane w kolumnach okresu są ustalane przez SQL Server na podstawie początku transakcji i wyrażane w czasie UTC. Z tego powodu analiza historii powinna uwzględniać strefę czasową oraz sposób prezentowania dat w aplikacji. Jeżeli kilka zmian zostanie wykonanych w ramach jednej transakcji, ich znaczniki czasu mogą wskazywać ten sam moment rozpoczęcia transakcji. Temporal Tables rejestrują stan danych, ale nie opisują automatycznie przyczyny zmiany, użytkownika aplikacji ani uzasadnienia biznesowego operacji.

Zapytania historyczne i ograniczenia mechanizmu

Do odczytu danych z uwzględnieniem historii SQL Server udostępnia klauzulę FOR SYSTEM_TIME. Zapytanie AS OF pozwala odczytać stan tabeli z określonego momentu. Warianty FROM ... TO, BETWEEN ... AND oraz CONTAINED IN służą do wyszukiwania wersji obowiązujących w podanym przedziale czasu. Opcja ALL zwraca bieżące oraz historyczne wersje rekordów. Zapytanie może wyglądać następująco: SELECT * FROM dbo.Orders FOR SYSTEM_TIME AS OF '2026-01-15T10:00:00'.

Wynik zapytania historycznego może zawierać kilka wersji tego samego rekordu, dlatego identyfikator klucza głównego nie wystarcza do rozróżnienia wszystkich zmian. Tabela historii nie powinna być traktowana jak zwykła tabela archiwalna przeznaczona do dowolnej ręcznej modyfikacji. SQL Server pilnuje zgodności jej struktury z tabelą główną, w tym liczby kolumn, ich kolejności i typów. Przy projektowaniu rozwiązania trzeba także uwzględnić rozmiar tabeli historii, indeksy oraz wpływ częstych aktualizacji na wydajność. Temporal Tables nie zastępują kopii zapasowych, replikacji ani dziennika transakcji, ponieważ służą przede wszystkim do odtwarzania zmian danych na poziomie wierszy.

Sprawdzanie poprawności działania tabel czasowych

Diagnostyka problemów z Temporal Tables powinna rozpocząć się od sprawdzenia, czy tabela główna ma włączone wersjonowanie systemowe oraz czy wskazana tabela historii istnieje i zachowała zgodną strukturę. Należy zweryfikować definicję kolumn okresu, ich typ datetime2, oznaczenia ROW START i ROW END oraz ustawienie SYSTEM_VERSIONING. Warto również porównać zakresy czasowe kolejnych wersji tego samego rekordu. Nakładające się okresy albo nieoczekiwane przerwy mogą wskazywać na błędną migrację, ręczną ingerencję lub nieprawidłową interpretację czasu UTC.

Jeżeli historia nie zawiera oczekiwanej zmiany, trzeba ustalić, czy operacja rzeczywiście została wykonana na tabeli czasowej, czy nie została przerwana przez błąd transakcji. Istotne jest także odróżnienie czasu wykonania zapytania od czasu obowiązywania wersji. Instrukcja AS OF pokazuje stan według znaczników zapisanych przez SQL Server, a nie według czasu odczytu z aplikacyjnego logu. Podczas naprawy niespójności należy zachować ostrożność, ponieważ wyłączenie wersjonowania przez ALTER TABLE ... SET (SYSTEM_VERSIONING = OFF) pozwala wykonywać operacje administracyjne, ale jednocześnie usuwa automatyczną ochronę zapewnianą przez system wersjonowania na czas tej operacji.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę