微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不按照HISTORY_RETENTION_PERIOD策略删除旧数据

如何解决不按照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,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不保证删除数据的顺序。 当我按记录计数检查时,可以看到数据已被删除。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。