2011-09-07 37 views
1

在我的應用程序中,使用SQL Server 2005,我有兩個表,我們稱他們爲表A和表B;在表B中定義了一個外鍵約束,引用了表A中的主鍵列,這是一個自動生成的整數ID。我跑了以下簡單的交易:SQL Server合併複製導致外鍵失敗

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'. 

我不能讓它通過插入數據表。然而,除去合併複製後提交後的工作,一切工作。數據庫代碼是用C++編寫的,使用ADO。

無論如何,複製是否會干擾事務?任何其他可能的解釋?

回答

0

看起來問題與@@ IDENTITY函數的範圍有關。當我用LAST_IDENT('TableB')代替時,事情似乎有效。

如MSDN描述:

  • IDENT_CURRENT返回在任何會話和任何範圍的特定表生成的最後一個標識值。
  • @@ IDENTITY返回當前會話中任何表中爲所有作用域生成的最後一個標識值。
  • SCOPE_IDENTITY返回爲當前會話中的任何表格生成的最後一個標識值和當前範圍。
1

兩個服務器節點上的表A上的主鍵值是否相互離散(換句話說,您是否在每個節點上使用標識範圍管理)?

另外,是否已將外鍵約束配置爲Not For Replication property

我會假設因爲您的外鍵約束已經在發佈服務器本地執行,您不需要在與訂閱服務器合併時重新檢查它。

+0

謝謝!關於你的觀點 - 1.我正在使用自動身份管理。無論如何,這項活動非常稀少 - 我不認爲PK衝突是這裏的根本原因。 2.我在外鍵(在兩臺服務器上)應用了「NOT FOR REPLICATION」屬性,但似乎沒有改變這種情況。 – Itaypk