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

適用於: SQL Server 2016 (13.x) 和更新版本 Azure SQL DatabaseAzure 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;