适用于: 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
- 从历史记录中删除不必要的数据(
DELETE或TRUNCATE) - 在不进行版本控制的情况下从当前表中移除数据(
DELETE,TRUNCATE) - 将当前表中的
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;