Временные таблицы SQL Server - PullRequest
       60

Временные таблицы SQL Server

0 голосов
/ 06 декабря 2018

У меня есть база данных SQL Server 2017, и я создал таблицу Department, как показано ниже

CREATE TABLE Department
(
    DeptID INT NOT NULL PRIMARY KEY CLUSTERED,
    DeptName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDeptID INT NULL,
    StartTime DATETIME2 GENERATED ALWAYS AS ROW START
        CONSTRAINT DF_Department_SysStartTime DEFAULT SYSUTCDATETIME() NOT NULL,
    EndTime DATETIME2 GENERATED ALWAYS AS ROW END
        CONSTRAINT DF_Department_SysEndTime 
        DEFAULT CONVERT( DATETIME2, '9999-12-31 23:59:59' ) NOT NULL,
    PERIOD FOR SYSTEM_TIME(StartTime, EndTime)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory));

Затем я вставил строку, используя код ниже

INSERT INTO Department (DeptID, DeptName, DepartmentDescription)
VALUES (1, 'Sales', 'Sales department')

Iзапустил выбор для таблиц Department и DepartmentHistory, Department содержал 1 строку, которую я вставил, но DepartmentHistory нет.

Я запустил обновление, как показано ниже, опубликуйте обновлениеDepartmentHistory был заполнен 1 строкой.

UPDATE Department 
SET DeptID = 2 
WHERE DeptID = 1

Во временных таблицах не отображаются вставленные строки?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Да, новый вставленный столбец не имеет версии, если он не изменен.Как только значения изменяются, они обновляются в таблице истории, поскольку создается версия записи.

0 голосов
/ 06 декабря 2018

Все это очень хорошо задокументировано в Документах MS: https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017

INSERTS: В INSERT система устанавливает значение для столбца SysStartTime равным времени началатекущая транзакция (в часовом поясе UTC) основана на системных часах и присваивает значение для столбца SysEndTime максимальному значению 9999-12-31.Это помечает строку как открытую.

ОБНОВЛЕНИЯ: При ОБНОВЛЕНИИ система сохраняет предыдущее значение строки в таблице истории и устанавливает значение для столбца SysEndTime в начальное времятекущей транзакции (в часовом поясе UTC) на основе системных часов.Это помечает строку как закрытую с записанным периодом, для которого строка была действительной.В текущей таблице строка обновляется новым значением, и система устанавливает для столбца SysStartTime значение времени начала транзакции (в часовом поясе UTC) на основе системных часов.Значение для обновленной строки в текущей таблице для столбца SysEndTime остается максимальным значением 9999-12-31.

...