システム バージョン管理されたテンポラル テーブルでシステム バージョン管理を停止する
適用対象: 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
) - バージョン管理を行わずに現在のテーブルからデータを削除する (
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;