Sql-Server

奇怪的 UPDATE 導致存在合併複製

  • November 28, 2017

我有一個訪問 SQL Server 後端的 MS Access 前端數據庫。當不複製 SQL Server 數據庫時,這(據我們所知)完美無缺。一旦我們引入複製(從作為發布者的適當伺服器上的 SQL Server Standard 到使用 Merge Replication 作為訂閱者的筆記型電腦上的 SQL Server Express),我們就會開始出現我無法解釋的奇怪的數據庫損壞。

發生的情況是我們有針對數據庫中的多個表執行的 UPDATE 查詢,並且我們也讓 Access 本身對多個表執行 CRUD 操作(這種損壞不僅限於一個表)。我們看到的結果是隨機(大約十分之一的操作)正在更新我們想要更新的行以外的行,這會覆蓋我們不想覆蓋的數據。

複製設置後,作為拉合併在筆記型電腦上按需執行,並且無論是否執行複制都會發生損壞。它只需要啟用。未啟用複制時似乎不會發生損壞。

我在這裡並沒有指責微軟有任何過錯——我完全有可能只是忘記勾選某個框來防止這種情況發生。我只是不確定我需要尋找什麼。

編輯:我所說的腐敗是什麼意思:假設我有行:

ID | FirstName | LastName
--------------------------
1  | John      | Smith
2  | Emma      | Citizen
3  | Bob       | May

然後我按照以下方式執行:

UPDATE Table SET FirstName = "Test" WHERE ID = 1

在那之後,我最終得到了這個:

ID | FirstName | LastName
--------------------------
1  | Test      | Smith
2  | Test      | Citizen
3  | Bob       | May

在任何處理複製的系統表中都沒有錯誤消息。架構中的唯一變化是,當啟用複制時,它會創建 rowguid 列。

因此,事實證明(經過數小時的嘗試診斷此問題)我確實遇到了由啟用合併複製引起的問題,而不是我認為的問題。為了將來參考,這就是發生的事情……

我有一個用 VBA 編寫的 DAO 查詢,如下所示:

Set rs = CurrentDb.OpenRecordset("tblExample", dbOpenDynaset, dbSeeChanges)
rs.AddNew

rs.FirstName = "John"
rs.LastName = "Citizen"

rs.Update

rs.Move 0, rs.LastModified
txtPrimaryKey.Value = rs!PrimaryKeyID

rs.Close

問題是rs.Move 0, rs.LastModified行,它移動到最近更新的行(剛剛插入的行),然後下一行檢索新的主鍵。這有多個問題:

  • 如果兩個使用者同時插入記錄,這將為兩個使用者檢索相同的主鍵。
  • 當然,在插入後執行以執行合併複製的觸發器也會更改(在其他表中),因此這再次返回複製正在執行的操作的主鍵,而不是我們正在執行的操作。

基本上,此程式碼適用於單使用者數據庫(這是它的起源),但不適用於多使用者場景。

解決方案(目前)與此類似,使用剛剛插入的所有值手動檢索正確的行:

txtPrimaryKey.Value = DLookup("PrimaryKeyID", "tblExample", "FirstName=""John"" AND LastName=""Citizen""")

這還有其他潛在問題(如果您有兩行具有完全相同的數據,您可能會得到錯誤的主鍵 ID),但在這種情況下,對於這個表來說,這不是問題。

引用自:https://dba.stackexchange.com/questions/187984