システム バージョン管理されたテンポラル テーブルのスキーマを変更する
適用対象: 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;