更改系统版本控制时态表的架构
适用于: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 = PAGE
或DATA_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;