システム バージョン管理されたテンポラル テーブルでシステム バージョン管理を停止する

対象者:SQL Server 2016 (13.x) およびそれ以降のバージョン Azure SQL DatabaseAzure SQL Managed InstanceSQL Database in Microsoft Fabric

一時的または永続的に、テンポラル テーブルでバージョン管理を停止する場合があります。 これを実行するには、SYSTEM_VERSIONING 句を OFF に設定します。

SYSTEM_VERSIONING = OFF を設定する

特定の保守作業を時間テーブルで行いたい場合や、バージョン管理テーブルが不要な場合はシステムのバージョン管理を停止してください。 この操作により、2つの独立したテーブルが得られます:

  • 期間が定義された現在のテーブル
  • 通常のテーブルとしての履歴テーブル

Remarks

履歴テーブルは、SYSTEM_VERSIONING = OFF 中に更新プログラムのキャプチャを停止します。

SYSTEM_VERSIONING = OFF を設定するか、SYSTEM_TIME 期間を削除すると、テンポラル テーブルでデータが失われません。

SYSTEM_VERSIONING = OFFを設定して、SYSTEM_TIME期間を落とさない場合、システムは挿入および更新操作ごとに期間の列を更新し続けます。 現在のテーブルでの削除は永続的なものになります。

期間列を削除するには、SYSTEM_TIME 期間を削除します。 期間列を削除するには、ALTER TABLE <table> DROP <column>;を使用します。 詳細については、「システム バージョン管理テンポラル テーブルのスキーマの変更」を参照してください。

SYSTEM_VERSIONING = OFF を設定すると、十分な権限を持つすべてのユーザーが、履歴テーブルのスキーマおよび内容を変更したり、履歴テーブルを完全に削除したりできます。

参照SYSTEM_TIMEなど、時間的クエリ拡張を使うSCHEMABINDINGで他のオブジェクトを作成している場合は、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)
  • バージョン設定なしで現在のテーブルからデータを削除する方法(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;