Эволюция не стоит на месте, она затрагивает не только живое, но и все окружающие нас вещи, в том числе и SQL Server.
Появляются новые возможности которые существенно упрощают жизнь не только разработчикам , админам , но и конечным потребителям информации.
Ниже опишу полезные возможности которые были найдены на просторах интернета в различных статьях. Полный список от МС
здесь.
Для начала изучения возможностей, скачиваем примеры которые есть у
MS, затем распаковываем.
В папке будут примеры по каждой новой возможности, рассмотрим кратко каждую из них.
Temporal – исторические таблицы
Отличается от обычной таблицы возможностью хранить историю изменений строк без создания триггеров и дополнительных таблиц. Подробнее
здесь
Для включения опции в таблице должны быть два столбца дат с типом datetime2 и опцией GENERATED ALWAYS AS ROW START и GENERATED ALWAYS AS ROW END
+ необходимо включить опцию версионирования таблицы с указанием имени исторической таблицы
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
--Исторические таблицы, любую таблицу можно преобразовать в историческую
CREATE TABLE Employee
(
EmployeeID int Primary KEY,
FirstName varchar(20) NOT NULL,
LastName varchar(20) NOT NULL,
DepartmentName varchar(50) NOT NULL
)
GO
INSERT INTO Employee VALUES
(1,'Ken','Sanchez','Executive'),
(2,'Terri','Sanchez','Engeneering'),
(3,'Roberto','Sanchez','Engeneering'),
(4,'Bob','Sanchez','Engeneering'),
(5,'Gail','Sanchez','Support'),
(6,'Dylan','Sanchez','Support')
select * from employee
--чтобы скрыть столбцы дат, добавьте hidden в инструкцию
ALTER TABLE EMPLOYEE ADD
StartDate datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL DEFAULT CAST('1901-01-01 00:00:00.0000000' as datetime2),
EndDate datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL DEFAULT CAST('9999-12-31 23:59:59.9999999' as datetime2),
PERIOD FOR SYSTEM_TIME( StartDate,EndDate)
GO
ALTER TABLE Employee SET (system_versioning = on(history_table=dbo.EmployeeHistory))
GO
--TEST
UPDATE employee
SET LastName = 'Markao'
WHERE employeeid = 2
GO
UPDATE employee
SET LastName = 'Johnson'
WHERE employeeid = 3
GO
UPDATE employee
SET LastName = 'Ganja'
WHERE employeeid = 4
GO
DELETE employee WHERE employeeid = 5
GO
--Disable versioning
Alter table employee SET (system_versioning = off)
--Enable versioning
Alter table employee SET (system_versioning = ON)
--Проверяем данные
select * from employee order by employeeID , Startdate
Declare @datestart datetime2 = dateadd(ss,-5,getdate())
select * from employee for system_time as of @datestart
Declare @datestart datetime2 = dateadd(ss,-10,getdate())
select * from employee for system_time as of @datestart
Declare @datestart datetime2 = dateadd(ss,-15,getdate())
select * from employee for system_time as of @datestart
--Добавление столбца, автоматически добавляет его в историческую таблицу
alter table employee add RegionID int null
--Cleanup
Alter table employee SET (system_versioning = OFF)
drop table if exists EmployeeHistory
drop table if exists employee