Sql server 不删除每个历史记录的过期数据\u保留期\u策略
环境:在Windows Server 2016标准上运行的SQL Server 2017企业版 测试用例 创建两个相同的时态表(仅因名称不同),其中一个表的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
历史记录\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语句。聚集索引是在默认情况下创建的历史记录表上创建的。在任何情况下,若索引不存在,将表更改为有限保留期都会导致错误。