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

适用于:SQL Server 2016 (13.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例

使用 ALTER TABLE 语句添加、更改或删除列。

注解

要更改时态表的架构,需要具有对当前和历史记录表的 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

示例

A. 更改时态表的架构

下面是一些关于更改临时表架构的示例。

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

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

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 NOT NULL
    CONSTRAINT DF_Cntr DEFAULT 0;

ALTER TABLE [dbo].[CompanyLocation] SET
(
    SYSTEM_VERSIONING = ON
    (HISTORY_TABLE = [dbo].[CompanyLocationHistory])
);

COMMIT;