我创建了以下临时表
/*
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
并且条目将在插入后迅速被历史化。
另一方面,这很好,从那时起我就不必手动将表模式与历史表模式同步。