奇怪的 UPDATE 導致存在合併複製
我有一個訪問 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),但在這種情況下,對於這個表來說,這不是問題。