Темпоральные таблицы SQL Server

У меня есть база данных 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')

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

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

UPDATE Department 
SET DeptID = 2 
WHERE DeptID = 1

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


person GDS    schedule 06.12.2018    source источник
comment
Вы скорее имеете в виду: они не показывают текущую строку. Теперь, с чего бы им;)   -  person TomTom    schedule 06.12.2018
comment
Почему они должны показывать вставленные строки, если они уже существуют в таблице? с другой стороны, они будут отображать удаленные / обновленные строки.   -  person Ilyes    schedule 06.12.2018
comment
так что, возможно, некоторая ясность, взяв пример выше, DepartmentHistory показывает идентификатор отдела как 2 после обновления, на самом деле отдел 1 был начальным значением, которое было изменено на 2, поэтому проблема в том, что таблица History не записывает изменения правильно из вставки. Это ожидаемое поведение?   -  person GDS    schedule 06.12.2018


Ответы (2)


Все это очень хорошо задокументировано в документации 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.

person dfundako    schedule 06.12.2018
comment
Я все еще понимаю, как это может сбивать с толку. Потому что он говорит, что он отмечает строку как открытую, и это может быть прочитано как строка в таблице истории, поэтому кто-то может ожидать увидеть эту строку там (думал, что это вообще не будет эффективно) - person scsimon; 06.12.2018
comment
@scsimon Верно, но между документами и реальным примером того, что он не отображается, вывод довольно очевиден. - person dfundako; 06.12.2018

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

person Shashi Kumar Singh    schedule 12.04.2019