次の方法で共有


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

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

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

解説

テンポラル テーブルのスキーマを変更するには、現在のテーブルおよび履歴テーブルの 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 列の追加
  • 履歴テーブルが SPARSE または SPARSE (履歴テーブルの既定値) に設定されている場合に、DATA_COMPRESSION = PAGE 列を追加する、または既存の列を DATA_COMPRESSION = ROW に変更します。
  • 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;