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

适用于: SQL Server 2016 (13.x) 及以后版本 Azure SQL 数据库Azure 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 = PAGEDATA_COMPRESSION = ROW,这是历史表的默认设置。
  • 添加 COLUMN_SET
  • 添加列 ROWGUIDCOL 或更改现有列为 ROWGUIDCOL
  • 如果列在当前或历史表中包含 null 值,则将 NULL 列更改为 NOT NULL

Examples

A. 更改时态表的架构

以下是一些改变时序表模式的例子。

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;