Sql server 不删除每个历史记录的过期数据\u保留期\u策略

Sql server 不删除每个历史记录的过期数据\u保留期\u策略,sql-server,temporal-tables,Sql Server,Temporal Tables,环境:在Windows Server 2016标准上运行的SQL Server 2017企业版 测试用例 创建两个相同的时态表(仅因名称不同),其中一个表的历史记录\u保留期设置为1天。另一个表设置为无限 代码: CREATE TABLE dbo.TemporalPurgeTestNew ( TemporalPurgeTestNewId int IDENTITY(1,1) , InsertedDate dat

环境:在Windows Server 2016标准上运行的SQL Server 2017企业版

测试用例

创建两个相同的时态表(仅因名称不同),其中一个表的
历史记录\u保留期
设置为1天。另一个表设置为
无限

代码:

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
ALTER TABLE dbo.TemporalPurgeTestExistTbl
SET (SYSTEM_VERSIONING = ON 
    (   HISTORY_TABLE = dbo.TemporalPurgeTestExistTblHistory
    ,   DATA_CONSISTENCY_CHECK = ON
    ,   HISTORY_RETENTION_PERIOD = 1 DAY
    ));
在每个表中插入1条记录

创建SQL Server代理作业以修改每个表中的记录,并让作业运行3天

在第三天,验证保留期为1天的表是否在关联的历史记录表中清除了第一天的数据,并且第二个历史记录表仍然包含第一天的数据

更改第二个表,将保留期设置为1天

代码:

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
ALTER TABLE dbo.TemporalPurgeTestExistTbl
SET (SYSTEM_VERSIONING = ON 
    (   HISTORY_TABLE = dbo.TemporalPurgeTestExistTblHistory
    ,   DATA_CONSISTENCY_CHECK = ON
    ,   HISTORY_RETENTION_PERIOD = 1 DAY
    ));
预期:数据将以与第一个临时表相同的方式从第二个历史表中清除

实际:未按保留策略集删除第二个历史表中的过期数据

这是预期的行为还是我在清除第二个时态表中的数据时遗漏了一个步骤。

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

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

请共享表的DDL。Microsoft document说:“请务必注意,只有具有聚集索引(B-tree或columnstore)的历史记录表才能配置有限保留策略。”可能这就是包含的caseDDL语句。聚集索引是在默认情况下创建的历史记录表上创建的。在任何情况下,如果索引不存在,将表更改为有限保留期都会导致错误。请共享表的DDL。Microsoft document说:“请务必注意,只有具有聚集索引(B-tree或columnstore)的历史记录表才能配置有限保留策略。”可能这就是包含的caseDDL语句。聚集索引是在默认情况下创建的历史记录表上创建的。在任何情况下,若索引不存在,将表更改为有限保留期都会导致错误。