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

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

你可能希望暂时或永久停止对时态表的版本控制。 您可以通过将 SYSTEM_VERSIONING 子句设置为 OFF 来实现这一点。

将 SYSTEM_VERSIONING 设置为 OFF

如果你想在时序表上执行特定维护操作,或者不再需要版本表,就停止系统版本管理。 该操作给出两个独立的表:

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

Remarks

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

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

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

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

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

如果你有其他使用 SCHEMABINDING 创建且使用了时序查询扩展的对象(例如引用 SYSTEM_TIME),则不能设置 SYSTEM_VERSIONING = OFF。 如果设置 SYSTEM_VERSIONING = OFF,则此限制可防止这些对象失败。

永久移除 SYSTEM_VERSIONING

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

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

如果你想将时间表恢复为非时间表,可以选择去掉周期。

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 TRANSACTION;