適用於: SQL Server 2016 (13.x) 和更新版本
Azure SQL Database
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 資料庫
使用 ALTER TABLE 陳述式新增、改變或移除資料行。
Remarks
你需要 CONTROL 對目前和歷史資料表取得權限才能更改時態資料表的結構。
在 ALTER TABLE 作業期間,系統會保留這兩個資料表的結構鎖定。
資料庫引擎 會根據變更類型,將結構變更傳遞到歷史資料表。
在所有版本的 SQL Server 上,新增 varchar(max)、nvarchar(max)、varbinary(max) 或 xml 欄位並預設值,都是更新資料操作。
如果新增欄位後的列大小超過列大小限制,你就無法在線新增欄位。
使用新的 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
Examples
答: 變更時態表的結構描述
以下是一些改變時序表結構的例子。
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;