适用于: 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 = 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)
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;