SQL Server 2016 时态表

Deb*_*bra 5 sql-server import temporal-tables sql-server-2016

有没有人试过用旧的历史数据预填充时态表?在我们决定使用时态表之前,我们需要能够将我们的旧历史导入其中。

Aar*_*and 4

是的,您可以将旧历史记录导入历史表中。这是一个简单的示例,展示了如何执行此操作 - 您需要暂时关闭系统版本控制。

CREATE TABLE dbo.TemporalExampleHistory
(
  TemporalID int NOT NULL,
  UserName   sysname,
  ValidFrom  datetime2 NOT NULL,
  ValidTo    datetime2 NOT NULL
);
GO

CREATE TABLE dbo.TemporalExample
(
  TemporalID int PRIMARY KEY,
  UserName   sysname,
  ValidFrom  datetime2 GENERATED ALWAYS AS ROW START NOT NULL,
  ValidTo    datetime2 GENERATED ALWAYS AS ROW END   NOT NULL,
  PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
) 
WITH
(
  SYSTEM_VERSIONING = ON 
  (
    HISTORY_TABLE = dbo.TemporalExampleHistory
  )
);
Run Code Online (Sandbox Code Playgroud)

现在,插入一些数据:

INSERT dbo.TemporalExample(TemporalID, UserName)
  VALUES(1,N'Bob'),(2,N'Frank');

-- update a row to make some history:

UPDATE dbo.TemporalExample
  SET UserName = N'Frankie'
  WHERE TemporalID = 2;
Run Code Online (Sandbox Code Playgroud)

验证历史表中是否存在系统版本控制的行:

SELECT * FROM dbo.TemporalExampleHistory;
Run Code Online (Sandbox Code Playgroud)

现在,将行插入历史记录中。一次执行一个步骤;如果这些都在一个批次中,解析器将阻止插入。

BEGIN TRANSACTION; -- may want SERIALIZABLE here

ALTER TABLE dbo.TemporalExample SET (SYSTEM_VERSIONING = OFF);

INSERT dbo.TemporalExampleHistory(TemporalID, UserName, ValidFrom, ValidTo)
  SELECT TOP (1) TemporalID, N'Little Frankie', '19000101', ValidFrom
    FROM dbo.TemporalExampleHistory 
    WHERE TemporalID = 2
    ORDER BY ValidFrom;

ALTER TABLE dbo.TemporalExample SET
(
  SYSTEM_VERSIONING = ON 
  (
    HISTORY_TABLE = dbo.TemporalExampleHistory,
    DATA_CONSISTENCY_CHECK = ON
  )
);

COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

现在验证历史表中现在有两个版本化的 id = 2 行:

SELECT * FROM dbo.TemporalExampleHistory;
Run Code Online (Sandbox Code Playgroud)