対象者:SQL Server 2016 (13.x) およびそれ以降のバージョン
Azure SQL Database
Azure SQL Managed Instance
SQL 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;