SQL Server复制和标识列

时间:2014-10-18 20:15:51

标签: sql sql-server sql-server-2012 replication identity-column

我们的生产环境中有一个大型数据库(100 GB),我们有两个镜像。我们使用复制来同步我们的镜像数据库。(SQL Server 2012上的事务复制)

当我们创建复制时,我们的DBA首先从我们的服务器下载完整备份并在镜像服务器上恢复它,然后在Publisher(Production-DB)和Subscriber(Mirror-1)之间配置复制。一切都很好,镜子和制作完美同步。

在每次发布之前,我们应该使用REAL在我们的UAT服务器上测试我们的系统!数据。所以我们从我们的一个镜像服务器(现场镜像)创建一个备份,并在我们的UAT数据库上恢复它。

我们数据库中的所有表都有一个PK,如:

[ID] [int] IDENTITY(1,1) NOT NULL

在我们的UAT数据库中,OrderTransaction表ID的最后一条记录ID = 160.000.000,但是当我们的应用程序尝试插入此表时,系统遇到问题并引发异常。

  

违反PRIMARY KEY约束'ID'。无法在对象中插入重复键...

系统尝试插入小于160.000.000的整数值(ID = 145.695.000) 当我查询数据库时,这个id是生产数据库的备份恢复到镜像数据库并且在事务复制开始之后的最后一个ID。 生产和镜像的所有信息都正确同步,两台服务器上的表的ID相同且相同。

当我在UAT或镜像数据库上运行此命令时,它返回145.695.000

SELECT IDENT_CURRENT( 'OrderTransaction' )

当我阅读MSDN,博客和相关的SO问题时,这个问题与复制和标识列有关。

但是,我如何强制我们的Mirror数据库增加其生产身份。(并接受此值作为本地身份值)。或者我们应该编写一个脚本,重新设置每个表以便在我们的UAT环境中进行测试!?

感谢。

1 个答案:

答案 0 :(得分:2)

如果您只是在将产品镜像恢复到UAT时遇到问题,那么您提出的最简单的解决方案可能就是为每个表编写一个重新编写的脚本。

对于复制和身份问题的更常见问题,您可能会发现this excellent article from Hilary Cotter on Simple-Talk有用。

  

在本文中,我们研究了实现身份管理的方法   复制中的解决方案以避免主键冲突。我们看了看   分区和手动和自动标识范围管理   解决方案。使用自动身份范围管理的解决方案可以很好地进行仔细规划。

编辑: 这应该将所有身份重置为当前最大值:

EXEC sp_MSForEachTable '
IF OBJECTPROPERTY(object_id(''?''), ''TableHasIdentity'') = 1
DBCC CHECKIDENT (''?'', RESEED)'

Pinal Dave's work进行了轻微修改。