适用于: SQL Server 2016 (13.x)及更高版本
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 预览版中的 SQL 数据库
使用 ALTER TABLE 语句添加、更改或删除列。
Remarks
要更改时态表的架构,需要具有对当前和历史记录表的 CONTROL 权限。
在 ALTER TABLE 操作过程中,系统持有这两个表的架构锁。
指定的架构更改会以合适的方式(具体取决于更改的类型)传播到历史记录表。
添加具有默认值的 varchar(max)、nvarchar(max)、varbinary(max) 或 XML 列将对 SQL Server 的所有版本执行更新数据操作。
如果添加列后的行大小超出行大小限制,则不能联机添加新列。
使用新的 NOT NULL 列扩展表后,请考虑删除对历史记录表的默认约束,因为系统将自动填充此表中的所有列。
在时态表中,联机选项 (WITH (ONLINE = ON) 对 ALTER TABLE ALTER COLUMN 不起任何作用。 无论为 ALTER 选项指定的值是什么,都不会联机执行 ONLINE 列。
可以使用 ALTER COLUMN 更改时间段列的 IsHidden 属性。
不能使用直接 ALTER 进行以下架构更改。 对于这些类型的更改,请设置 SYSTEM_VERSIONING = OFF。
- 添加计算列
- 添加
IDENTITY列 - 历史记录表设置为
SPARSE或SPARSE(历史记录表的默认值)时,添加DATA_COMPRESSION = PAGE列或将现有列更改为DATA_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) 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;