システム バージョン管理されたテンポラル テーブルのスキーマを変更する

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

ALTER TABLE ステートメントを使用して、列を追加、変更、または削除します。

Remarks

時間テーブルのスキーマを変更するには、現在テーブルと履歴テーブルの許可 CONTROL が必要です。

ALTER TABLE 操作中は、システムが両方のテーブルのスキーマ ロックを保持します。

データベース エンジンは、変更の種類に応じてスキーマの変更を履歴テーブルに伝播させます。

varchar(max)、nvarchar(max)、varbinary(max)、またはXML列をデフォルトで追加することは、すべてのSQL Serverエディションで更新データ操作です。

列を追加した後の行サイズが行サイズの制限を超えると、オンラインで新しい列を追加できません。

新しいNOT NULL の列でテーブルを拡張すると、そのテーブルのすべての列がシステムから自動的に生成されるため、履歴テーブルの既定の制約が削除されることを考慮してください。

テンポラル テーブルでは、オンライン オプション (WITH (ONLINE = ON) は ALTER TABLE ALTER COLUMN に影響を与えません。 ALTER列操作は、ONLINEオプションの値に関わらずオンラインで実行されません。

ALTER COLUMN を使用して、期間の列の IsHidden プロパティを変更できます。

次のスキーマ変更の ALTER を直接使用することはできません。 このような変更を行う場合は SYSTEM_VERSIONING = OFF を設定してください。

  • 計算列を追加する
  • IDENTITY 列の追加
  • 履歴テーブルがデフォルトであるDATA_COMPRESSION = PAGEまたは DATA_COMPRESSION = ROWに設定されているときに、SPARSE列を追加したり既存の列をSPARSEに変更したりします。
  • COLUMN_SET を追加する
  • ROWGUIDCOL列を追加したり、既存の列をROWGUIDCOLに変更したりする
  • 現在のテーブルまたは履歴テーブルの列に null 値が含まれている場合に NULL 列を NOT NULL に変更する

Examples

A. テンポラル テーブルのスキーマを変更する

ここでは、時系列表のスキーマを変更するいくつかの例を示します。

ALTER TABLE dbo.Department
    ALTER COLUMN DeptName VARCHAR (100);

ALTER TABLE dbo.Department
    ADD WebAddress NVARCHAR (255)
        CONSTRAINT DF_WebAddress DEFAULT 'www.example.com' NOT NULL;

ALTER TABLE dbo.Department
    ADD TempColumn INT;
GO

ALTER TABLE dbo.Department
    DROP COLUMN TempColumn;

B. HIDDEN フラグを使用して期間列を追加する

ALTER TABLE dbo.Department
    ALTER COLUMN ValidFrom ADD HIDDEN;

ALTER TABLE dbo.Department
    ALTER COLUMN ValidTo ADD HIDDEN;

ALTER COLUMN <period_column> DROP HIDDEN を使用して、期間列の非表示フラグをクリアできます。

C. SYSTEM_VERSIONING を OFF に設定してスキーマを変更する

以下の例は、まだ SYSTEM_VERSIONING = OFF を設定しなければならない場合( IDENTITY 列を追加する)スキーマを変更する方法を示しています。 この例では、データの整合性チェックを無効にしています。 トランザクション内でスキーマを変更する場合は、データ変更が同時に起こらないため、このチェックは不要です。

BEGIN TRANSACTION;

ALTER TABLE [dbo].[CompanyLocation]
    SET (SYSTEM_VERSIONING = OFF);

ALTER TABLE [CompanyLocation]
    ADD Cntr INT IDENTITY (1, 1);

ALTER TABLE [dbo].[CompanyLocationHistory]
    ADD Cntr INT
        CONSTRAINT DF_Cntr DEFAULT 0 NOT NULL;

ALTER TABLE [dbo].[CompanyLocation]
SET (
    SYSTEM_VERSIONING = ON
    (HISTORY_TABLE = [dbo].[CompanyLocationHistory])
);

COMMIT TRANSACTION;