Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Относится к: SQL Server 2016 (13.x) и более поздние версии
База данных SQL Azure
Управляемый экземпляр SQL Azure
SQL Database в Microsoft Fabric
Временные таблицы (также известные как системные временные таблицы) — это функция базы данных, которая обеспечивает встроенную поддержку информации о данных, хранящихся в таблице в любой момент времени, а не только о текущих данных.
Начните работу с системно-версионируемыми темпоральными таблицами, а также ознакомьтесь с сценариями использования темпоральных таблиц.
Что такое темпоральная таблица с системным управлением версиями?
Системно-версионируемая временная таблица — это тип пользовательской таблицы, предназначенной для хранения полной истории изменений данных, что позволяет выполнять анализ на определённый момент времени. Такой тип временной таблицы называется системно-версионируемой временной таблицей, поскольку система управляет периодом действия каждой строки (то есть ядро СУБД (ядро СУБД)).
В каждой темпоральной таблице есть два явно определенных столбца, каждый из которых имеет тип данных datetime2 . Эти столбцы называются периодическими столбцами. ядро СУБД использует эти столбцы с периодами исключительно для записи периода действия каждой строки при изменении строки. Основная таблица, в которой хранятся текущие данные, называется текущей таблицей или временной таблицей.
Помимо столбцов периода, в темпоральной таблице также содержится ссылка на другую таблицу с отзеркаленной схемой, которая называется таблицей журнала. Она используется в системе для автоматического сохранения предыдущей версии строки при каждом ее обновлении или удалении в темпоральной таблице. Во время создания темпоральной таблицы можно указать существующую таблицу журнала (которая должна соответствовать схеме) или разрешить системе создавать таблицу журнала по умолчанию.
Почему темпоральный?
Реальные источники данных динамичны, и бизнес-решения часто основываются на выводах, которые аналитики получают из изменений данных. Варианты использования темпоральных таблиц включают следующее.
- Аудит всех изменений данных и выполнение экспертизы данных при необходимости.
- Восстановление состояния данных на любой момент времени в прошлом
- Вычисление тенденций во времени.
- Поддержка медленно изменяющегося измерения для приложений, связанных с поддержкой принятия решений.
- Восстановление после случайных изменений данных и ошибок приложений
Как работает Temporal?
Системное управление версиями для таблицы реализуется как пара таблиц: текущая таблица и таблица журнала. В каждой из этих таблиц два дополнительных столбца datetime2 определяют период действия каждой строки:
Столбец начала периода: в этом столбце система записывает время начала для строки; обычно он обозначается как
ValidFrom.Столбец окончания периода: в этом столбце система записывает время окончания для строки, обычно обозначаемом как столбец
ValidTo.
В текущей таблице содержится текущее значение для каждой строки. В таблице журнала содержатся все предыдущие значения (старые версии) для каждой строки и время начала и окончания промежутка, в котором действовали эти значения (если они заданы).
В следующем скрипте описан сценарий с данными сотрудника:
CREATE TABLE dbo.Employee
(
[EmployeeID] INT NOT NULL PRIMARY KEY CLUSTERED,
[Name] NVARCHAR (100) NOT NULL,
[Position] VARCHAR (100) NOT NULL,
[Department] VARCHAR (100) NOT NULL,
[Address] NVARCHAR (1024) NOT NULL,
[AnnualSalary] DECIMAL (10, 2) NOT NULL,
[ValidFrom] DATETIME2 GENERATED ALWAYS AS ROW START,
[ValidTo] DATETIME2 GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
Дополнительные сведения см. в статье "Создание системной темпоральной таблицы".
Вставки: Система устанавливает значение столбца
ValidFromна начальное время текущей транзакции (в часовом поясе UTC) на основе системных часов и присваивает значениеValidToстолбца максимальному значению9999-12-31. При этом строка помечается как открытая.Обновления: система хранит предыдущее значение строки в таблице истории и устанавливает значение
ValidToстолбца на начальное время текущей транзакции (в часовом поясе UTC) на основе системных часов. При этом строка помечается как закрытая с записью периода, в течение которого строка была действительной. В текущей таблице строка обновляется со своим новым значением, а система задает значениеValidFromстолбца для времени начала транзакции (в часовом поясе UTC) на основе системных часов. Значение обновлённой строки в текущей таблице для столбцаValidToостаётся максимальным значением9999-12-31.Удаление: Система хранит предыдущее значение строки в таблице истории и устанавливает значение столбца
ValidToна начальное время текущей транзакции (в часовом поясе UTC) на основе системных часов. При этом строка помечается как закрытая с записью периода, в течение которого была действительной предыдущая строка. Строка в текущей таблице удаляется. Запросы текущей таблицы не возвращают эту строку. Только запросы, которые имеют дело с данными журнала, возвратят данные, строка для которых была закрыта.Слияние: Операция ведёт себя точно так же, как если бы было выполнено до трёх операторов (
INSERT,UPDATEи/илиDELETE), в зависимости от того, что указано в качестве действий в оператореMERGE.
Время, записанное в системных столбцах datetime2, основано на времени начала выполнения самой транзакции. Например, все строки, вставляемые в одну транзакцию, имеют одинаковое время в формате UTC, записанное в столбце, соответствующем началу SYSTEM_TIME периода.
При выполнении запросов на изменение данных в темпоральной таблице ядро СУБД добавляет строку в таблицу журнала, даже если значения столбцов не изменяются.
Как выполнить запрос для темпоральных данных?
Инструкция SELECT ... FROM <table> содержит новую конструкцию FOR SYSTEM_TIME с пятью темпоральными вложенными предложениями для запроса данных из текущих и исторических таблиц. Этот новый синтаксис инструкции SELECT непосредственно поддерживается для одной таблицы, распространяется на несколько соединений и на представления, построенные поверх нескольких темпоральных таблиц.
Когда вы используете оператор FOR SYSTEM_TIME в запросе с одним из пяти подпредложений, результаты включают исторические данные из временной таблицы, как показано на следующем рисунке.
Приведенный ниже запрос ищет версии строк о сотруднике с условием фильтра WHERE EmployeeID = 1000, которые были активны хотя бы часть промежутка между 1 января 2021 г. и 1 января 2022 г. (включая верхнюю границу промежутка):
SELECT *
FROM Employee FOR SYSTEM_TIME
BETWEEN '2021-01-01 00:00:00.0000000' AND '2022-01-01 00:00:00.0000000'
WHERE EmployeeID = 1000
ORDER BY ValidFrom;
FOR SYSTEM_TIME фильтрует строки с периодом действия с нулевой длительностью (ValidFrom = ValidTo).
ядро СУБД генерирует эти строки, если вы выполняете несколько обновлений одного и того же первичного ключа в рамках одной транзакции. В этом случае темпоральные запросы возвращают только версии строк до выполнения транзакций и текущие версии строк после их выполнения.
Если необходимо включить эти строки в анализ, выполните запрос к таблице журнала напрямую.
В следующей таблице ValidFrom в столбце «Квалифицирующие строки» обозначает значение в столбце ValidFrom запрашиваемой таблицы, а ValidTo обозначает значение в столбце ValidTo запрашиваемой таблицы. Полный синтаксис и примеры см. в предложении FROM с JOIN, APPLY и PIVOT и Запрос данных в системно-версионной темпоральной таблице.
| Expression | Квалифицирование строк | Note |
|---|---|---|
AS OF
date_time |
ValidFrom <=
date_timeAND ValidTo >date_time |
Возвращает таблицу со строками, содержащими значения, которые являлись текущими в указанный момент времени в прошлом. Внутри системы объединение выполняется между темпоральной таблицей и таблицей журнала. Результаты фильтруются для возврата значений в строке, допустимой в момент времени, указанной параметром date_time . Значение строки считается допустимым, если значение system_start_time_column_name меньше или равно значению параметра date_time, а значение system_end_time_column_name больше значения параметра date_time. |
FROM
start_date_timeTOend_date_time |
ValidFrom <
end_date_timeAND ValidTo >start_date_time |
Возвращает таблицу со значениями для всех версий строк, которые были активны в течение указанного диапазона времени, независимо от того, начали ли они активны до значения параметра start_date_time аргумента FROM или перестали быть активными после значения параметра end_date_time для аргумента TO . Внутри системы объединение выполняется между темпоральной таблицей и таблицей журнала. Результаты фильтруются, чтобы возвращать значения для всех версий строк, которые были активными в любое время в течение указанного диапазона времени. Строки, которые перестали быть активными точно на нижней границе, определенной FROM конечной точкой, не включаются, а записи, которые стали активными точно на верхней границе, определенной TO конечной точкой, также не включаются. |
BETWEEN
start_date_timeANDend_date_time |
ValidFrom <=
end_date_timeAND ValidTo >start_date_time |
Аналогично предыдущему описанию FOR SYSTEM_TIME FROMstart_date_timeTOend_date_time, за исключением того, что таблица возвращаемых строк включает строки, которые стали активными на верхней границе, заданной конечной точкой end_date_time. |
CONTAINED IN(start_date_time, end_date_time) |
ValidFrom >=
start_date_timeAND ValidTo <=end_date_time |
Возвращает таблицу со значениями для всех открытых и закрытых версий строк в течение указанного диапазона времени, определенного двумя значениями периода для аргумента CONTAINED IN . Включаются строки, которые стали активными ровно на нижней границе интервала или перестали быть активными ровно на верхней границе интервала. |
ALL |
Все строки | Возвращает объединение строк, принадлежащих текущей и исторической таблицам. |
Скрыть столбцы периода
Вы можете скрыть столбцы с периодами, чтобы SELECT запросы, которые явно не ссылаются на них, не возвращали эти столбцы, например SELECT * FROM <table>.
Чтобы вернуть скрытый столбец, явно укажите его в запросе. Аналогично операторы INSERT и BULK INSERT продолжают работать так, как будто этих новых столбцов периода не существовало (при этом значения столбцов заполняются автоматически).
Подробнее об использовании предложения HIDDEN см. в CREATE TABLE и ALTER TABLE.
Samples
ASP.NET. Сведения о создании темпорального приложения с помощью темпоральных таблиц см. в веб-приложении ASP.NET Core.
Пример базы данных AdventureWorks: скачайте базу данных AdventureWorks для SQL Server, которая включает функции темпоральной таблицы.
Связанные материалы
- Особенности и ограничения темпоральной таблицы
- Управление хранением исторических данных в системных темпоральных таблицах
- Секционирование с использованием темпоральных таблиц
- Проверки согласованности систем темпоральных таблиц
- Безопасность темпоральной таблицы
- Представления и функции темпоральных метаданных таблицы
- Работа с системно-версионными темпоральными таблицами, оптимизированными для памяти
- Создание системной темпоральной таблицы
- Изменение данных в системной темпоральной таблице
- Запрос данных в системной темпоральной таблице
- Приступите к изучению системных версионных темпоральных таблиц
- Системно-версионированные темпоральные таблицы с таблицами, оптимизированными для памяти