首页 > 解决方案 > 不根据 HISTORY_RETENTION_PERIOD 政策删除过期数据

问题描述

环境:在 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
    ));

预期:数据将从第二个历史表中以与第一个时态表相同的方式清除。

实际:第二个历史表中的老化数据不会按保留策略集删除。

这是预期的行为,还是我错过了清除第二个时态表中数据的步骤。

标签: sql-servertemporal-tables

解决方案


更新:我对历史表清除有错误的假设。我希望从表中删除最旧的数据,但 SQL Server 不保证删除数据的顺序。当我按记录计数检查时,我可以看到数据被删除。


推荐阅读