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

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

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

解説

テンポラル テーブルのスキーマを変更するには、現在のテーブルおよび履歴テーブルの CONTROL 権限が必要です。

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

指定したスキーマ変更は、適切に (変更の種類に応じて) 履歴テーブルに反映されます。

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

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

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

テンポラル テーブルでは、オンライン オプション (WITH (ONLINE = ON) は ALTER TABLE ALTER COLUMN に影響を与えません。 ONLINE オプションに指定された値に関係なく、ALTER 列はオンラインとしては実行されません。

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

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

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

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

ここでは、テンポラル テーブルのスキーマを変更する例をいくつか示します。

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

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

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 NOT NULL
    CONSTRAINT DF_Cntr DEFAULT 0;

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

COMMIT;