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

PERIOD FOR SYSTEM_TIME

Termin Definicja
PERIOD FOR SYSTEM_TIME

PERIOD FOR SYSTEM_TIME to konstrukcja definiująca kolumny okresu ważności wiersza w tabeli temporalnej.

Rola PERIOD FOR SYSTEM_TIME w tabeli temporalnej SQL Server

PERIOD FOR SYSTEM_TIME jest elementem definicji tabeli temporalnej system-versioned w Microsoft SQL Server. Konstrukcja wskazuje dwie kolumny przechowujące początek i koniec okresu obowiązywania danego wiersza. Kolumny te tworzą przedział czasu, w którym konkretna wersja rekordu była uznawana przez system za aktualną. Najczęściej używa się nazw ValidFrom i ValidTo, ale SQL Server nie wymaga właśnie takich nazw. Obie kolumny muszą mieć typ datetime2, a w definicji określa się je jako GENERATED ALWAYS AS ROW START oraz GENERATED ALWAYS AS ROW END.

Sama konstrukcja PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo) nie włącza jeszcze pełnego wersjonowania. Do tego potrzebna jest opcja SYSTEM_VERSIONING = ON oraz tabela historii, w której SQL Server zapisuje wcześniejsze wersje zmienionych albo usuniętych wierszy. Przykładowa definicja może wyglądać następująco: CREATE TABLE dbo.Urzadzenia (Id int NOT NULL PRIMARY KEY, Model nvarchar(100) NOT NULL, ValidFrom datetime2 GENERATED ALWAYS AS ROW START NOT NULL, ValidTo datetime2 GENERATED ALWAYS AS ROW END NOT NULL, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.UrzadzeniaHistory));. W praktycznej definicji często dodaje się również domyślne wartości dla kolumn okresu.

Jak SQL Server wyznacza czas obowiązywania wersji

W tabeli system-versioned SQL Server zapisuje czas związany z transakcją, która zmieniła dane, a nie dowolną datę biznesową wpisaną przez użytkownika. Gdy rekord zostaje zaktualizowany, jego dotychczasowa wersja trafia do tabeli historii, a w tabeli głównej pojawia się nowa wersja. Przy usunięciu rekord z tabeli bieżącej również zostaje zachowany w historii. Wartość kolumny początku okresu nowej wersji i wartość końca okresu wersji archiwalnej są ustalane przez aparat bazy danych zgodnie z czasem transakcji.

Przedziały systemowe są interpretowane jako domknięte z lewej i otwarte z prawej: wersja obowiązuje od wartości ValidFrom włącznie do wartości ValidTo wyłącznie. Dzięki temu dwie następujące po sobie wersje nie powinny obejmować tego samego punktu czasowego. Dla aktualnego wiersza wartość końca okresu jest ustawiana na bardzo odległą datę reprezentującą nieskończone trwanie wersji. Kolumny okresu można oznaczyć jako HIDDEN, aby nie pojawiały się w domyślnym wyniku SELECT *; nie zmienia to jednak ich udziału w mechanizmie wersjonowania ani możliwości odwoływania się do nich po nazwie.

Odczyt historii przez klauzulę FOR SYSTEM_TIME

Znaczenie kolumn zdefiniowanych przez PERIOD FOR SYSTEM_TIME ujawnia się podczas zapytań historycznych. Dla tabeli temporalnej można użyć klauzuli FOR SYSTEM_TIME z wariantami takimi jak AS OF, FROM ... TO, BETWEEN ... AND, CONTAINED IN oraz ALL. Zapytanie SELECT * FROM dbo.Urzadzenia FOR SYSTEM_TIME AS OF '2026-08-24T10:00:00' zwraca stan danych obowiązujący w określonym czasie. SQL Server łączy w tym celu dane z tabeli bieżącej i odpowiadającej jej tabeli historii.

Wariant FROM ... TO wybiera wersje, których okres częściowo pokrywa się z podanym przedziałem, przy czym górna granica jest wyłączona. BETWEEN ... AND działa podobnie, ale uwzględnia wersje aktywne dokładnie w chwili końcowej. CONTAINED IN ogranicza wynik do wersji w całości mieszczących się w zadanym zakresie, natomiast ALL zwraca bieżące oraz historyczne wersje bez ograniczenia czasowego. Przy analizie wyniku należy pamiętać, że tabela historii nie jest zwykłą kopią zapasową. Zawiera wersje rekordów obsługiwane przez system temporalny, a jej retencję, indeksowanie i dostępność trzeba konfigurować zgodnie z wymaganiami konkretnej bazy.

Kontrola definicji i diagnostyka tabel temporalnych

Podczas diagnostyki SQL Server warto sprawdzić, czy kolumny wskazane w PERIOD FOR SYSTEM_TIME mają typ datetime2, właściwe oznaczenia generowania oraz ograniczenie NOT NULL. Należy także potwierdzić, że kolumna początku okresu występuje przed kolumną końca okresu w definicji okresu i że tabela ma poprawnie skonfigurowane SYSTEM_VERSIONING. Informacje o tabelach temporalnych można odczytywać z widoków katalogowych, między innymi sys.tables, sys.periods i sys.columns. Powiązanie z tabelą historii jest przechowywane w metadanych SQL Server, dlatego nie trzeba ustalać go wyłącznie na podstawie nazwy tabeli.

Błędna interpretacja okresu może prowadzić do nieprawidłowych wniosków podczas odtwarzania stanu danych. Kolumny ValidFrom i ValidTo opisują czas systemowy wersji, a niekoniecznie moment rozpoczęcia i zakończenia rzeczywistego zdarzenia w świecie biznesowym. Jeżeli aplikacja ma przechowywać osobny termin obowiązywania umowy, gwarancji albo rezerwacji, taki przedział powinien być zdefiniowany jako niezależne kolumny. W razie problemów z historią trzeba sprawdzić również transakcje modyfikujące dane, uprawnienia do tabeli bieżącej i historii, indeksy oraz to, czy zapytanie używa właściwej klauzuli FOR SYSTEM_TIME. Neutralna diagnostyka powinna obejmować zarówno schemat tabeli, jak i rzeczywiste wersje zapisane w historii.

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