首页 > 解决方案 > 时态表可以对插入进行历史记录吗?

问题描述

我创建了以下临时表

/*
ALTER TABLE [dbo].________Test SET ( SYSTEM_VERSIONING = OFF)
GO
DROP TABLE dbo.________Test
GO
DROP TABLE dbo.________TestHistory
GO
*/

CREATE TABLE dbo.________Test
(
    DeptID INT NOT NULL PRIMARY KEY CLUSTERED
  , DeptName VARCHAR(50) NOT NULL
  , ManagerID INT NULL
  , ParentDeptID INT NULL
  , SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL
  , SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL
  , PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
-- ) WITH (SYSTEM_VERSIONING = ON); 
) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.________TestHistory));

现在我可以插入、更新和删除值。
但是这些值只会在更新或删除时被历史化。
有没有办法历史化插入语句?

我想避免为此编写触发器,如果​​可能的
话......将数据放在两个表中是非常不利的,因为我需要先创建一个联合,然后错过之后创建的任何字段,或者我如果我使用 SELECT * 并创建联合视图,则可能有垃圾列,如果列顺序被更改,而且新列也会丢失。

嗯,那些临时表似乎真的很愚蠢(制作)......
显然,即使数据没有变化,它们也会记录每一个潜在的变化。
所以我可以这样做:

CREATE TRIGGER TR_________Test_AfterInsert ON dbo.________Test
    AFTER INSERT
AS
BEGIN 
    UPDATE dbo.________Test 
        SET DeptID = DeptID 
    WHERE DeptID IN 
    (
        SELECT DeptID
        FROM inserted
    )
END

并且条目将在插入后迅速被历史化。
另一方面,这很好,从那时起我就不必手动将表模式与历史表模式同步。

标签: sql-servertsqlsql-server-2016sql-server-2019temporal-tables

解决方案


推荐阅读