停止系统控制版本时态表的系统版本控制

适用于: sql Server 2016 (13.x) 及更高版本Azure SQL 数据库 Microsoft Fabric 中的 SQL 数据库Azure SQL 托管实例 SQL 数据库

你可能希望暂时或永久停止对时态表的版本控制。 将属性 SYSTEM_VERSIONING 子句设置为 OFF,可以实现此目的。

将 SYSTEM_VERSIONING 设置为 OFF

如果希望对时态表执行特定的维护操作或者不再需要版本控制的表,请停止系统版本控制。 由于此操作,你将获得两个独立的表:

  • 具有时间段定义的当前表
  • 作为常规表的历史记录表

注解

历史记录表在 SYSTEM_VERSIONING = OFF期间停止捕获更新。

设置 SYSTEM_VERSIONING = OFF 或删除 SYSTEM_TIME 时期时,时态表上不会出现数据丢失的情况。

设置 SYSTEM_VERSIONING = OFF 且不删除 SYSTEM_TIME 时间段时,系统继续更新每个插入和更新操作的时间段列。 对当前表执行的删除操作是永久性的。

必须删除 SYSTEM_TIME 时间段才能删除时间段列。 要删除时间段列,请使用 ALTER TABLE <table> DROP <column>;。 有关详细信息,请参阅更改系统版本控制时态表的架构

设置 SYSTEM_VERSIONING = OFF 时,具有足够权限的所有用户都能够修改历史记录表的架构和内容,甚至还可以永久删除该历史记录表。

如果使用临时查询扩展(如引用 SYSTEM_VERSIONING = OFF)通过 SCHEMABINDING 创建了其他对象,则无法设置 SYSTEM_TIME。 如果设置 SYSTEM_VERSIONING = OFF,则此限制可防止这些对象失败。

永久删除 SYSTEM_VERSIONING

此示例永久删除了 SYSTEM_VERSIONING,并删除了时间段列。 删除时间段列是可选的操作。

ALTER TABLE dbo.Department
SET (SYSTEM_VERSIONING = OFF);

-- Optionally, DROP PERIOD if you want to revert temporal table to a non-temporal
ALTER TABLE dbo.Department
DROP PERIOD FOR SYSTEM_TIME;

暂时删除 SYSTEM_VERSIONING

以下列表包括需要将系统版本控制设置为 OFF 的操作列表:

  • 从历史记录中删除不必要的数据(DELETETRUNCATE
  • 从没有版本控制的当前表中删除数据(DELETETRUNCATE
  • 从当前表的 SWITCH OUT 分区
  • SWITCH IN 分区到历史记录表

此示例暂时停止了 SYSTEM_VERSIONING,以便允许执行特定的维护操作。 如果作为表维护的先决条件暂时停止了版本控制,那么强烈建议在事务内进行此更改,以便保持数据一致性。

重新打开系统版本控制时,请勿忘记指定 HISTORY_TABLE 参数。 如果不这样做,就会创建新的历史记录表并将其与当前表关联。 原始历史记录表仍可作为普通表存在,但不再与当前表关联。

BEGIN TRANSACTION;

ALTER TABLE dbo.Department
SET (SYSTEM_VERSIONING = OFF);

TRUNCATE TABLE [History].[DepartmentHistory]
WITH (PARTITIONS(1, 2));

ALTER TABLE dbo.Department
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.DepartmentHistory));

COMMIT;