1

我已通过事务复制将一系列表从SQL Server 2008迁移到新的SQL Server 2012计算机。目前为止工作正常,我还复制了索引和默认值以确保复制的数据与原始数据相同。迁移后避免填充身份空白

当我将新机器从复制中分离出来以代替旧机器时,SQL Server开始填补我标识列中的所有空白,这可能会导致不同的问题。即我的代码不能依赖于最后插入的行的最高ID。此外,先前删除的用户ID也会被回收,这可能会导致用户方的混淆。

有没有办法让我的数据库的新实例的行为完全像旧的复制?根据我的经验,数据库的运行实例永远不会填满先前删除的行的空位。

回答

1

我从来没有见过这个。但是,它可能会在表部署后重新生成0。注意这个例子:

SET NOCOUNT ON; 
GO 
CREATE TABLE dbo.fooblat(id INT IDENTITY(1,1)); 
GO 
INSERT dbo.fooblat DEFAULT VALUES; 
GO 3 
DELETE dbo.fooblat WHERE id = 2; 
GO 
DBCC CHECKIDENT('dbo.fooblat', RESEED, 0); 
GO 
INSERT dbo.fooblat DEFAULT VALUES; 
GO 3 
SELECT id FROM dbo.fooblat ORDER BY id; 
GO 
DROP TABLE dbo.fooblat; 

结果:现在

id 
---- 
1 
1 
2 
3 
3 

,如果标识列也是主键或其他唯一的,这个相同的操作可能会在缺口依然充满,只重复违规将失败。所以用这个表定义再次重复:

CREATE TABLE dbo.fooblat(id INT IDENTITY(1,1) PRIMARY KEY); 
GO 

息率这个(第一成功插入填补了国内空白):

id 
---- 
1 
2 
3 

消息2627,级别14,状态1,行
违反PRIMARY KEY约束'PK_ fooblat _3213E83F6BF0A0C6'。无法在对象'dbo.fooblat'中插入重复键。重复的键值是(1)。
Msg 2627,Level 14,State 1,Line 1
违反PRIMARY KEY约束'PK_ fooblat _3213E83F6BF0A0C6'。无法在对象'dbo.fooblat'中插入重复键。重复的键值是(3)。

您可以通过确保表格在放入其他系统时正确接种来避免这种情况。这可能只是意味着使用更可靠的部署技术,也可能意味着 - 填充后,让任何用户在之前 - 你做这样的事情:

DECLARE @i INT, @sql NVARCHAR(MAX); 
SELECT @i = MAX(id) FROM dbo.fooblat; 
SET @sql = N'DBCC CHECKIDENT(''dbo.fooblat'', RESEED, ' + RTRIM(@i) + ');'; 
EXEC sp_executesql @sql; 
+0

非常感谢。这实际上是诀窍。 :) – Emsi 2013-02-13 03:51:11