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

適用於: 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 COLUMNALTER欄位操作不會在線上執行,不管你為選項指定ONLINE什麼值。

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

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

  • 加入計算資料行
  • 新增 IDENTITY 欄位
  • SPARSE新增欄位或將現有欄位改為 ,SPARSE當歷史表設定為 DATA_COMPRESSION = PAGEDATA_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;