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

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL DatabaseAzure SQL Managed Instance

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

SYSTEM_VERSIONING = OFF を設定する

テンポラル テーブルで特定のメンテナンス操作を実行する場合、またはバージョン管理されたテーブルを今後必要としない場合は、システム バージョン管理を停止します。 この操作により、次の 2 つの独立したテーブルが得られます。

  • 期間が定義された現在のテーブル

  • 通常のテーブルとしての履歴テーブル

重要な解説

  • 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に設定する必要がある操作を示します。

  • 履歴から不要なデータを削除する (DELETE または TRUNCATE)
  • バージョン管理を行わずに現在のテーブルからデータを削除する (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 ;

次のステップ