共用方式為


更改系統版本化時間表的架構

適用於: SQL Server 2016 (13.x)和更新版本,Azure SQL DatabaseAzure SQL 受控實例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 COLUMNALTER 資料行無論ONLINE 選項指定何值,都不會以線上方式執行。

您可以使用 ALTER COLUMN 來變更時期資料行的 IsHidden 屬性。

您不能使用直接 ALTER 進行下列結構描述變更。 針對這些類型的變更,請設定 SYSTEM_VERSIONING = OFF

  • 加入計算資料行
  • 新增 IDENTITY 欄位
  • 將歷程記錄資料表設定為 SPARSESPARSE (歷程記錄資料表的預設值) 時,新增 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;