SQL Server合并复制会导致外键失败

时间:2011-09-07 08:13:27

标签: sql-server ado foreign-key-relationship

在我的应用程序中,使用SQL Server 2005,我有两个表,我们称之为表A和表B;表B中定义了外键约束,引用了表A中的主键列,它是一个自动生成的整数ID。我正在运行以下简单的事务:

Start transaction
Insert a row to table A
Retrieve the last-generated ID ("SELECT @@IDENTITY ... ")
Insert data to table B, using this ID
Commit

一切正常,直到我尝试与另一个SQL Server 2005创建合并复制(连续)。由于外键约束失败,发布者和订阅者在尝试向表B插入数据时现在都失败了此事务:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_TableB_TableA". The conflict occurred in database "MyDB", table "TableA", column 'ID'.

我无法通过在将数据插入表A后提交来使其工作。但是,在删除合并复制后,一切正常。数据库代码使用ADO以C ++编写。

复制是否干扰了事务?还有其他可能的解释吗?

2 个答案:

答案 0 :(得分:1)

两个服务器节点上的表A上的主键值是否彼此分离(换句话说,您是否在每个节点使用身份范围管理)?

此外,是否使用Not For Replication property配置了外键约束?

我认为因为您的外键约束已在发布服务器本地强制执行,因此在与订阅服务器合并时无需重新检查它。

答案 1 :(得分:0)

看起来这个问题与@@ IDENTITY函数的范围有关。当我使用LAST_IDENT('TableB')时,事情似乎有效。

如MSDN中所述:

  • IDENT_CURRENT 会返回在任何会话和任何范围内为特定表生成的最后一个标识值。
  • @@ IDENTITY 会在所有范围内返回为当前会话中的任何表生成的最后一个标识值。
  • SCOPE_IDENTITY 会返回为当前会话中的任何表和当前范围生成的最后一个标识值。