システム バージョン管理されたテンポラル テーブルのスキーマを変更する
適用対象: SQL Server 2016 (13.x) 以降のバージョン
Azure SQL Database
Azure SQL Managed Instance
Microsoft 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;