Polecenie ALTER TABLE ADD PERIOD FOR SYSTEM_TIME dodaje kolumny okresu czasowego wymagane do włączenia tabeli czasowej.
Rola klauzuli PERIOD FOR SYSTEM_TIME w tabeli czasowej
Polecenie ALTER TABLE ADD PERIOD FOR SYSTEM_TIME jest elementem składni programu Microsoft SQL Server używanym przy konfigurowaniu tabeli czasowej, czyli tabeli system-versioned temporal table. Jego zadaniem jest zdefiniowanie okresu obowiązywania każdego wiersza w wymiarze czasu systemowego. Okres ten opisują dwie kolumny przechowujące znaczniki czasu: początek obowiązywania wersji oraz koniec obowiązywania wersji. SQL Server wykorzystuje te wartości do ustalenia, kiedy dana wersja rekordu była aktualna.
Klauzula PERIOD FOR SYSTEM_TIME nie przechowuje osobnej historii i sama nie powoduje jeszcze pełnego uruchomienia wersjonowania systemowego. Łączy wskazane kolumny w logiczny okres czasowy przypisany do tabeli. Kolumny muszą mieć typ datetime2, ponieważ mechanizm temporalny SQL Server wymaga precyzyjnych znaczników czasu odpowiednich do porządkowania zmian. W definicji okresu podaje się nazwy istniejących kolumn, na przykład PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo).
Składnia ALTER TABLE i wymagane kolumny okresu
W typowym przypadku polecenie ma postać ALTER TABLE dbo.Orders ADD PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo), gdzie ValidFrom i ValidTo są wcześniej utworzonymi kolumnami tabeli. Samo dodanie okresu nie dodaje automatycznie tych kolumn, dlatego przed wykonaniem klauzuli trzeba przygotować ich definicje. W tabeli przeznaczonej do wersjonowania kolumny okresu powinny być zdefiniowane jako kolumny generowane przez system, zwykle z wartościami domyślnymi opartymi na funkcji SYSUTCDATETIME() oraz wartością końca okresu ustawioną na maksymalny zakres typu datetime2.
Przykładowy fragment definicji może wyglądać następująco: ValidFrom datetime2 GENERATED ALWAYS AS ROW START NOT NULL oraz ValidTo datetime2 GENERATED ALWAYS AS ROW END NOT NULL. Następnie obie kolumny są wskazywane w klauzuli PERIOD FOR SYSTEM_TIME. Atrybuty GENERATED ALWAYS AS ROW START i GENERATED ALWAYS AS ROW END informują SQL Server, że wartości nie są zwykłymi danymi biznesowymi wpisywanymi dowolnie przez aplikację. Są metadanymi opisującymi przedział czasu przypisany do konkretnej wersji wiersza. Kolumny okresu muszą mieć zgodne typy i odpowiednią kolejność logiczną: pierwsza oznacza początek, a druga koniec okresu.
Powiązanie okresu z historią zmian
Po zdefiniowaniu okresu można włączyć wersjonowanie systemowe, wskazując tabelę historii albo pozwalając SQL Server na jej utworzenie zgodnie z odpowiednią konfiguracją. Dopiero system versioning powoduje automatyczne przenoszenie poprzednich wersji wierszy do tabeli historii podczas operacji UPDATE i DELETE. Wiersz znajdujący się w tabeli bieżącej reprezentuje aktualny stan, natomiast jego wcześniejsze wersje są przechowywane w tabeli historii razem z wartościami ValidFrom i ValidTo.
Znaczenie znaczników czasu najlepiej widać przy zapytaniach temporalnych. SQL Server może zwrócić stan tabeli z określonego momentu za pomocą konstrukcji FOR SYSTEM_TIME AS OF, a także wyszukiwać wersje należące do określonego przedziału przez FROM ... TO, BETWEEN ... AND lub CONTAINED IN. Wartości okresu są interpretowane jako granice przedziału czasu. Dla bieżącej wersji końcowy znacznik zwykle wskazuje wartość maksymalną, natomiast po zmianie rekordu poprzednia wersja otrzymuje rzeczywisty czas zakończenia obowiązywania, a nowa wersja zaczyna obowiązywać od czasu wykonania zmiany.
Kontrola poprawności przed uruchomieniem wersjonowania
Przed wykonaniem ALTER TABLE ADD PERIOD FOR SYSTEM_TIME należy sprawdzić, czy wskazane kolumny istnieją, mają typ datetime2, nie dopuszczają wartości NULL i zostały oznaczone jako początek oraz koniec okresu. Trzeba również zweryfikować wartości domyślne, ponieważ to one pozwalają SQL Server automatycznie uzupełniać znaczniki czasu przy dodawaniu nowych wierszy. Błąd w definicji jednej z kolumn może uniemożliwić dodanie okresu albo późniejsze włączenie wersjonowania.
W środowisku SQL Server należy także rozróżnić trzy operacje: utworzenie kolumn okresu, dodanie klauzuli PERIOD FOR SYSTEM_TIME oraz włączenie właściwości SYSTEM_VERSIONING. Są to powiązane, ale odrębne elementy konfiguracji. Diagnostyka problemu powinna obejmować definicję tabeli, właściwości kolumn, ograniczenia, wartości domyślne i ustawienia tabeli historii. Sam komunikat o błędzie przy ALTER TABLE nie zawsze wskazuje błąd danych; przyczyną może być niezgodny typ kolumny, brak wymaganej właściwości generowania przez system albo próba dodania okresu do tabeli, która już posiada okres systemowy. W razie poprawnej konfiguracji klauzula tworzy logiczne powiązanie kolumn czasu, na którym SQL Server opiera późniejsze zapytania i automatyczne przechowywanie wersji.