更改系统版本控制的临时表的架构

适用于: SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库Azure 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 句点列的属性。

  • 不能将 direct 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;

后续步骤