停止对由系统控制版本的时态表进行系统版本控制

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

你可能希望暂时或永久停止对临时表的版本控制。 可以通过将 SYSTEM_VERSIONING 子句设置为 OFF 来实现此操作 。

将 SYSTEM_VERSIONING 设置为 OFF

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

  • 具有时间段定义的当前表

  • 作为常规表的历史记录表

重要提示

  • 历史记录表在“SYSTEM_VERSIONING = OFF”期间停止捕获更新 。
  • 设置SYSTEM_VERSIONING = OFF 或删除SYSTEM_TIME期间时态表不会丢失数据。
  • 设置 SYSTEM_VERSIONING = OFF 且不删除 SYSTEM_TIME 时间段时,系统继续更新每个插入和更新操作的时间段列 。 对当前表执行的删除操作是永久性的。
  • 删除 SYSTEM_TIME 时间段可删除时间段列。
  • 设置 SYSTEM_VERSIONING = OFF 时,具有足够权限的所有用户都能够修改历史记录表的架构和内容,甚至还可以永久删除该历史记录表。
  • 如果使用临时查询扩展(如引用 SYSTEM_TIME)通过 SCHEMABINDING 创建了其他对象,则无法设置 SYSTEM_VERSIONING = OFF 。 如果设置 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 TRAN
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 ;

后续步骤