次の方法で共有


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

適用対象: SQL Server 2016 (13.x) 以降のバージョン Azure SQL Database Azure SQL Managed Instance Sql データベース

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

SYSTEM_VERSIONING = OFF を設定する

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

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

解説

履歴テーブルは、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);

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