【问题标题】:SQL Server temporal tablesSQL Server 时态表
【发布时间】:2018-12-06 16:50:54
【问题描述】:

我有一个 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

时态表不显示插入的行吗?

【问题讨论】:

  • 您的意思是:不显示当前行。现在,他们为什么要这样做;)
  • 既然插入的行已经存在于表中,为什么还要显示它们呢?另一方面,它们将显示已删除/更新的行。
  • 所以也许更清楚一些,以上面的例子,DepartmentHistory 显示更新后的部门 id 为 2,实际上部门 1 是初始值,它被更改为 2,所以问题是历史表没有记录插入时的更改。这是预期的行为吗?

标签: sql-server sql-server-2016 sql-server-2017 temporal-tables


【解决方案1】:

这在 MS Docs 中有很好的记录: https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017

插入: 在 INSERT 上,系统根据系统时钟将 SysStartTime 列的值设置为当前事务的开始时间(在 UTC 时区),并将 SysEndTime 列的值分配给最大值 9999-12- 31.这会将行标记为打开。

更新: 在 UPDATE 时,系统将行的先前值存储在历史表中,并根据系统时钟将 SysEndTime 列的值设置为当前事务的开始时间(在 UTC 时区)。这将该行标记为已关闭,并记录了该行有效的时间段。在当前表中,该行使用其新值进行更新,并且系统根据系统时钟将 SysStartTime 列的值设置为事务的开始时间(在 UTC 时区中)。当前表中 SysEndTime 列的更新行的值保持最大值 9999-12-31。

【讨论】:

  • 我仍然可以看到这可能会令人困惑。因为它说它将该行标记为打开,因此可以将其读取为历史记录表中的行,因此有人可能希望在那里看到该行(认为他根本没有效率)
  • @scsimon 是的,但是在文档和实际示例之间没有出现,结论很明显。
【解决方案2】:

是的,除非更改,否则新插入的列没有版本控制。一旦值发生变化,它就会在历史表中更新,因为生成了一个版本的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多