SQL Server 2016: Temporal Tables (часть 2)

By | June 26, 2015

В прошлой статье я показал как создавать temporal table с нуля. А как быть, если уже есть таблица для которой хотелось бы задействовать эту функциональность? Это мы сейчас и разберем.

Пусть у нас есть таблица:

CREATE TABLE dbo.Products(
productid int NOT NULL,
productname varchar(50) NOT NULL,
price numeric(5, 2) NULL,
CONSTRAINT PK_Product PRIMARY KEY NONCLUSTERED (
productid ASC ) )

Добавим две колонки для хранения периода актуальности данных:

ALTER TABLE dbo.Products
ADD StartDate DATETIME2(0) GENERATED ALWAYS AS ROW START HIDDEN NOT NULL
CONSTRAINT DFT_Product_StartDate DEFAULT(‘19000101’),
ENDDate DATETIME2(0) GENERATED ALWAYS AS ROW END HIDDEN NOT NULL
CONSTRAINT DFT_Product_EndDate DEFAULT(‘99991231 23:59:59’),
PERIOD FOR SYSTEM_TIME (StartDate, EndDate)

Обратите внимание на опцию HIDDEN. Она позволяет скрыть эти столбцы если будет выполняться команда

SELECT * FROM dbo.Products

(вы ведь запросы со звездочкой не используете?)

Отмечу, что заданы значения по умолчанию, чтобы заполнить новые колонки данными. Теперь нам не нужны эти значения :
ALTER TABLE dbo.Products
DROP CONSTRAINT DFT_Product_StartDate, DFT_Product_EndDate

Мы готовы включить поддержку хранения истории:

ALTER TABLE dbo.Products
SET ( SYSTEM_VERSIONING = ON ( HISTORY_TABLE = dbo.ProductsHistory ))

Вуаля J