變更系統版本設定時態表的結構描述

適用於:SQL Server 2016 (13.x) 及更新版本 Azure SQL DatabaseAzure SQL 受控執行個體

使用 ALTER TABLE 陳述式新增、改變或移除資料行。

範例

以下是變更時態表結構描述的一些範例。

ALTER TABLE dbo.Department
    ALTER COLUMN DeptName varchar(100);

ALTER TABLE dbo.Department
    ADD WebAddress nvarchar(255) NOT NULL
    CONSTRAINT DF_WebAddress DEFAULT 'www.mycompany.com';

ALTER TABLE dbo.Department
    ADD TempColumn INT;

GO

ALTER TABLE dbo.Department
    DROP COLUMN TempColumn;

/* Setting IsHidden property for period columns.
Use ALTER COLUMN <period_column> DROP HIDDEN to clear IsHidden flag */

ALTER TABLE dbo.Department
    ALTER COLUMN ValidFrom ADD HIDDEN;

ALTER TABLE dbo.Department
    ALTER COLUMN ValidTo ADD HIDDEN;

重要備註

  • 變更時態表結構描述所需的目前和記錄資料表的CONTROL 權限。

  • ALTER TABLE 作業期間,系統會保留這兩個資料表的結構描述鎖定。

  • 指定的結構描述變更會以適當的方式 (視變更的類型而定) 傳播至記錄資料表。

  • 加入 varchar(max)nvarchar(max)varbinary(max) 或含有預設值的 XML 資料行,將是所有 SQL Server 版本的更新資料作業。

  • 如果加入資料行之後的資料列大小超過資料列大小限制,則無法線上加入新的資料行。

  • 使用新的 NOT NULL 資料行擴充資料表之後,請考慮卸除記錄資料表的預設條件約束,因為系統會自動填入該資料表中的所有資料行。

  • 針對系統版本設定時態表,線上選項 (WITH (ONLINE = ON) 並不會影響 ALTER TABLE ALTER COLUMN。 無論針對 ONLINE 選項指定何值,都不會以線上方式執行 ALTER 資料行。

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

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

    • 加入計算資料行
    • 加入 IDENTITY 資料行
    • 在記錄資料表設定為 DATA_COMPRESSION = PAGEDATA_COMPRESSION = ROW (記錄資料表的預設值) 時新增 SPARSE 資料行或將現有資料行變更為 SPARSE
    • 加入 COLUMN_SET
    • 加入 ROWGUIDCOL 資料行或將現有資料行變更為 ROWGUIDCOL
    • 如果資料行在目前或歷程記錄表格中包含 Null 值,則會將 NULL 資料行邊更為 NOT NULL

下列範例示範如何變更仍需要設定 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;

後續步驟