迁移后避免填充身份空白
问题描述:
我已通过事务复制将一系列表从SQL Server 2008迁移到新的SQL Server 2012计算机。目前为止工作正常,我还复制了索引和默认值以确保复制的数据与原始数据相同。迁移后避免填充身份空白
当我将新机器从复制中分离出来以代替旧机器时,SQL Server开始填补我标识列中的所有空白,这可能会导致不同的问题。即我的代码不能依赖于最后插入的行的最高ID。此外,先前删除的用户ID也会被回收,这可能会导致用户方的混淆。
有没有办法让我的数据库的新实例的行为完全像旧的复制?根据我的经验,数据库的运行实例永远不会填满先前删除的行的空位。
答
我从来没有见过这个。但是,它可能会在表部署后重新生成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;
非常感谢。这实际上是诀窍。 :) – Emsi 2013-02-13 03:51:11