问题描述
环境:在Windows Server 2016 Standard上运行的sql Server 2017 Enterprise
测试用例
创建2个相同的时态表(仅名称不同),其中1个表的HISTORY_RETENTION_PERIOD
设置为1天。另一个表设置为INFINITE
。
代码:
CREATE TABLE dbo.TemporalPurgeTestNew
( TemporalPurgeTestNewId int IDENTITY(1,1),InsertedDate datetime2(0),ModifiedDate datetime2(0),UpdateNum int,CONSTRAINT pk_TemporalPurgeTestNew
PRIMARY KEY (TemporalPurgeTestNewId),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
( HISTORY_TABLE = dbo.TemporalPurgeTestNewHistory,DATA_CONSISTENCY_CHECK = ON,HISTORY_RETENTION_PERIOD = 1 DAY
));
GO
CREATE TABLE dbo.TemporalPurgeTestExistTbl
( TemporalPurgeTestNewId int IDENTITY(1,CONSTRAINT pk_TemporalPurgeTestExistTbl
PRIMARY KEY (TemporalPurgeTestNewId),SysEndTime))
WITH (SYstem_VERSIONING = ON
( HISTORY_TABLE = dbo.TemporalPurgeTestExistTblHistory
));
GO
在每个表中插入1条记录
创建一个sql Server代理作业以修改每个表中的记录,并使该作业运行3天。
在第三天,验证保留期为1天的表在关联的历史记录表中清除了第一天的数据,而第二历史记录表仍然包含第一天的数据。
第二张表将保留期限设置为1天
代码:
ALTER TABLE dbo.TemporalPurgeTestExistTbl
SET (SYstem_VERSIONING = ON
( HISTORY_TABLE = dbo.TemporalPurgeTestExistTblHistory,HISTORY_RETENTION_PERIOD = 1 DAY
));
已执行:将以与第一时态表相同的方式从第二历史表中清除数据。
实际:不会根据保留策略集删除第二历史表中的老化数据。
这是预期的行为还是我错过了清除第二个临时表中的数据的步骤。
解决方法
更新: 我对历史记录表清除有错误的假设。 我曾期望从表中删除最旧的数据,但是SQL Server不保证删除数据的顺序。 当我按记录计数检查时,可以看到数据已被删除。