【发布时间】:2020-08-17 19:45:18
【问题描述】:
环境:在 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,1)
, InsertedDate datetime2(0)
, ModifiedDate datetime2(0)
, UpdateNum int
, CONSTRAINT pk_TemporalPurgeTestExistTbl
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.TemporalPurgeTestExistTblHistory
));
GO
在每个表中插入 1 条记录
创建一个 SQL Server Agent Job 来修改每个表中的记录,让 Job 运行 3 天。
在第 3 天,验证保留期为 1 天的表在关联的历史记录表中清除了第一天的数据,并且第二个历史记录表仍然包含第一天的数据。
更改第二张表以将保留期设置为 1 天
代码:
ALTER TABLE dbo.TemporalPurgeTestExistTbl
SET (SYSTEM_VERSIONING = ON
( HISTORY_TABLE = dbo.TemporalPurgeTestExistTblHistory
, DATA_CONSISTENCY_CHECK = ON
, HISTORY_RETENTION_PERIOD = 1 DAY
));
预期:数据将从第二个历史表中以与第一个时态表相同的方式清除。
实际:不会根据保留策略集删除第二个历史表中的老化数据。
这是预期的行为还是我错过了清除第二个时态表中数据的步骤。
【问题讨论】:
-
请分享您的表的 DDL。微软文档说:“重要的是要注意,只有具有聚集索引(B 树或列存储)的历史表才能配置有限保留策略。”也许是这样
-
包含 DDL 语句。
-
聚集索引是在历史表上创建的,因为它是默认创建的。在任何情况下,如果索引不存在,将表更改为有限保留期将导致错误。
标签: sql-server temporal-tables