DBCC 校验码(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 数据库

检查 SQL Server 中指定表的当前标识值,如有必要,则更改标识值。 还可以使用 DBCC CHECKIDENT 为标识列手动设置新的当前标识值。

本文及其IDENTITY语法在不同SQL 数据库引擎平台上有所不同。 Microsoft Fabric Data Warehouse时,请在版本下拉列表中选择Fabric Data Warehouse

Transact-SQL 语法约定

语法

Syntax for SQL Server, Azure SQL 数据库, Azure SQL 托管实例, SQL database in Fabric:

DBCC CHECKIDENT
 (
    table_name
        [ , { NORESEED | { RESEED [ , new_reseed_value ] } } ]
)
[ WITH NO_INFOMSGS ]

Azure Synapse Analytics 的语法:

DBCC CHECKIDENT
 (
    table_name
        [ RESEED , new_reseed_value ]
)
[ WITH NO_INFOMSGS ]

参数

table_name

要对其当前标识值进行检查的表名。 你指定的表必须包含一个身份列。 表名必须遵循有关标识符的规则。 对于两部分或三部分名称使用分隔符,例如Person.AddressType[Person].[AddressType]或。

NORESEED

指定不应更改当前标识值。

RESEED

指定应该更改当前标识值。

new_reseed_value

用作标识列的当前值的新值。

使用 NO_INFOMSGS

取消显示所有信息性消息。

备注

对当前恒定值所做的具体修正 DBCC CHECKIDENT 取决于参数规格。

DBCC CHECKIDENT 命令 标识更正或所做的更正
DBCC CHECKIDENT (<table_name>, NORESEED) 不重置当前标识值。 DBCC CHECKIDENT 将返回标识列的当前标识值和当前最大值。 如果两个值不相同,重置恒定值以避免数值序列出现错误或空隙。
DBCC CHECKIDENT (<table_name>)



DBCC CHECKIDENT (<table_name>, RESEED)
如果表当前的身份值小于身份列中存储的最大身份值, DBCC CHECKIDENT 则使用身份列的最大值来重置。 请参阅后面的“例外”一节。
DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) 将当前标识值设置为 new_reseed_value。 如果自创建表以来没有插入任何行,或者使用 TRUNCATE TABLE 语句删除所有行,运行后 DBCC CHECKIDENT 插入的第一行作为 new_reseed_value 身份。 如果表格中有行,或者通过使用语DELETE句删除所有行,下一个插入的行使用new_reseed_value当前的增量值 + 。 如果事务插入了一行,之后被回滚,下一个插入的行将使用new_reseed_value当前的增量值+,就像该行被删除一样。 如果该表不为空,那么将标识值设置为小于标识列中的最大值的数字时,将会出现下列情况之一:

- 如果 PRIMARY KEY 身份列存在 OR UNIQUE 约束,后续插入操作时会生成错误消息 2627,因为生成的身份值与现有值冲突。

- 如果 PRIMARY KEY 不存在 OR UNIQUE 约束,后续插入操作会导致重复的身份值。

例外

下表列出了 DBCC CHECKIDENT 不自动重置当前标识值时的条件,并提供了重置该值的方法。

条件 重置方法
当前标识值大于表中的最大值。 执行 DBCC CHECKIDENT (<table_name>, NORESEED) 以确定列中的当前最大值。 接下来,在 命令中指定该值作为 new_reseed_value。



在将 DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) 设置为非常低的值的情况下执行 new_reseed_value,然后运行 DBCC CHECKIDENT (<table_name>, RESEED) 以更正该值。
删除表中的所有行。 在将 DBCC CHECKIDENT (<table_name>, RESEED, <new_reseed_value>) 设置为新的起始值的情况下执行 new_reseed_value

更改种子值

种子值是针对加载到表中的第一行插入到标识列的值。 所有后续行都包含当前标识值和增量值,其中当前标识值是为当前表或视图生成的最新标识值。

无法使用 DBCC CHECKIDENT 执行以下任务:

  • 更改创建表或视图时为标识列指定的原始种子值。

  • 重设表或视图中的现有行的种子值。

若要更改原始种子值并重设所有现有行的种子值,请删除并重新创建标识列,然后为标识列指定新的种子值。 当表包含数据时,还会将标识号添加到具有指定种子值和增量值的现有行中。 无法保证行的更新顺序。

结果集

无论是否为包含标识列的表指定了任何选项,DBCC CHECKIDENT 都会为所有操作(除了一个操作)返回以下消息。 该操作指定新的种子值。

正在检查标识信息: 当前标识值‘<当前标识值>’,当前列值‘<当前列值>’。 DBCC 执行完毕。 如果 DBCC 输出了错误消息,请与系统管理员联系。

DBCC CHECKIDENT 用于通过使用 RESEED <new_reseed_value> 来指定新的种子值时,将返回以下消息。

正在检查标识信息: 当前标识值为‘<当前标识值>’。 DBCC 执行完毕。 如果 DBCC 输出了错误消息,请与系统管理员联系。

权限

调用方必须拥有包含此表的架构,或者是 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。

Azure Synapse Analytics 需要 db_owner 权限。

示例

A. 在需要时重置当前标识值

以下示例可重置数据库中指定表当前的身份值(如有需要)。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType');
GO

B. 报告当前标识值

以下示例报告数据库中指定表当前的身份值,如果身份值错误,则不会进行纠正。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', NORESEED);
GO

C. 强制将当前标识值设为新值

以下示例强制该列AddressType当前的恒等值AddressTypeID为10。 由于表已有行,插入的下一行使用11作为值。 该列加1的新当前单位值即为该列的递增值。

USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO

D. 重置空表上的标识值

以下示例假设表的身份是 ,(1, 1)并在删除表中所有记录后,将该列ErrorLog当前的身份值ErrorLogID强制为 1。 由于表中没有现有的行,下一行插入时使用1作为值。 新的当前恒等值,不加TRUNCATE后列定义的增量值,或在后加增量值。DELETE

USE AdventureWorks2022;
GO
TRUNCATE TABLE dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 1);
GO
DELETE FROM dbo.ErrorLog
GO
DBCC CHECKIDENT ('dbo.ErrorLog', RESEED, 0);
GO

适用于:Microsoft Fabric 中的仓库

重新种入表的身份值Fabric Data Warehouse。 插入显式值后使用 DBCC CHECKIDENTSET IDENTITY_INSERT 以重新对齐身份范围,防止与未来自动生成的值冲突。

本文及其IDENTITY语法在不同SQL 数据库引擎平台上有所不同。

Transact-SQL 语法约定

语法

DBCC CHECKIDENT ( 'table_name' [ , RESEED ] )

参数

table_name

用于重新种入身份值的表名称。 表必须包含身份列。 表名可以包含模式名称,如 'dbo.DimCustomer''[dbo].[DimCustomer]'或 。

RESEED

RESEED关键词是可选的,但DBCC CHECKIDENT总是执行重种操作。 无论选择是否包含或省略,结果都是一样的。

关键RESEED词指示数据库引擎扫描所有已使用和保留的身份范围,并设置下一个身份值,以避免与现有值冲突。 Fabric Data Warehouse中,RESEED执行范围感知扫描,覆盖所有分布式计算节点,确定正确的下一个值。

备注

  • 在Fabric Data Warehouse中,唯一支持DBCC CHECKIDENT该选项的论证是RESEED选项,而它总是执行该选项。 系统会根据现有数据自动确定正确的下一个身份值范围。 你不能指定自定义的重种值。
  • 每次在使用IDENTITY_INSERT后运行DBCC CHECKIDENT以插入显式值。 该操作确保未来自动生成的值不会与手动插入的值发生冲突。
  • Fabric Data Warehouse中,不支持自定义new_reseed_value。 尝试提供某个值时会返回以下错误: Specifying a custom seed in Fabric Data Warehouse is not supported.
  • DBCC CHECKIDENT 获得可以阻止DML和DDL同时操作的锁。 为了减少干扰,当其他进程没有活跃使用该表时,应单独运行该命令。

权限

你必须拥有这张桌子或获得 ALTER 使用许可。

示例

A. 插入哨兵值后重新种子

在将哨兵值填充维 SET IDENTITY_INSERT度表后,重新种入身份列,以防止未来自动生成的值与手动插入的值发生冲突。

-- Insert sentinel values
SET IDENTITY_INSERT dbo.DimCustomer ON;

INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName)
VALUES (-1, 'Unknown'),
       (-2, 'Not Applicable');

SET IDENTITY_INSERT dbo.DimCustomer OFF;

-- Reseed to realign future identity values
DBCC CHECKIDENT('dbo.DimCustomer', RESEED);

B. 大批量迁徙后重新播种

迁移带有显式身份值的历史数据后,重新种种表,确保新行获得的值不会与迁移数据重叠。

-- After migrating data with IDENTITY_INSERT
DBCC CHECKIDENT('dbo.DimProduct', RESEED);

-- Future inserts receive auto-generated values beyond the migrated range
INSERT INTO dbo.DimProduct (ProductName, Category)
VALUES ('New Widget', 'Hardware');

C. 复制入后重新种子 IDENTITY_INSERT

加载数据COPY INTOIDENTITY_INSERT后,将 当 是 ON,重新种入身份列。 COPY INTO 选项覆盖了 的 IDENTITY_INSERT会话层级设置。

COPY INTO dbo.DimStore (StoreKey 1, StoreName 2, Region 3)
FROM 'https://storage.blob.core.windows.net/migration/dimstore.csv'
WITH (
    FILE_TYPE = 'CSV',
    IDENTITY_INSERT = 'ON'
);

-- Reseed after bulk load
DBCC CHECKIDENT('dbo.DimStore', RESEED);

D. 没有RESEED关键字的重新种子

RESEED关键词是可选的,但DBCC CHECKIDENT总是执行重种操作。 无论选择是否包含或省略,结果都是一样的。

-- Reseed without the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore');

-- Reseed with the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore', RESEED);