徵兆
當您在具有群組或唯一索引的資料表上執行更新,而更新發生在非主要唯一資料行時,修訂追蹤記錄與更新語句不一致。
例如,假設群組或唯一索引中包含名為 「column1」 的資料行。 當欄值從較大的值變更為較小的值 (例如將值從 20 變更為 16) 時,追蹤修訂提要欄位會在刪除作業之前收到插入作業。 例如,交易記錄插入列記錄作業是在刪除列作業之前收到,或是 「I」 是在 「D」 之前插入。
Sys_change_version |
sys_change_create_version |
sys_change_operation |
sys_change_column |
sys_change_coNtext |
PK_column |
1116 |
19 |
我 |
空 |
空 |
5639485628 |
1116 |
20 |
D |
空 |
空 |
5639485628 |
當欄值從較小的值變更為較大的值 (例如將值從 16 變更為 20) 時,會在 「I」 之前插入 「D」。
Sys_change_version |
sys_change_create_version |
sys_change_operation |
sys_change_column |
sys_change_coNtext |
PK_column |
1126 |
32 |
D |
空 |
空 |
5639485628 |
1126 |
33 |
我 |
空 |
空 |
5639485628 |
原因
發生此問題的原因在於追蹤修訂提要欄位中刪除/插入組之間的順序不正確。
解決方案
這個問題的修正套裝程式含在下列SQL Server更新中:
SQL Server 2016 Service Pack 1 的累積更新 9
關於SQL Server組建
SQL Server的每個新組建都包含上一個組建中的所有 Hotfix 與安全性修正。 建議您為 SQL Server 安裝最新組建:
狀態
Microsoft 已確認<適用於>一節所列的 Microsoft 產品確實有上述問題。
其他相關資訊
針對已啟用追蹤修訂的資料表,當非主要資料行的更新定義為唯一時,會將兩個專案插入修訂追蹤側邊資料表中:每個分割動作的一個專案,插入和刪除。
當 CHANGETABLE 函數被叫來列舉變更時,這些專案會依主鍵值排序,然後再匯總作業。 如果更新插入較低的值,會先在提要資料表上執行「I」作業,後面接著「D」運算。 這會導致傳回此資料列的作業不正確。 這是因為 「I」 跟隨 「D」 匯總為 「D」。
由於側邊資料表中只會保留主鍵值,因此不需要有兩個不同的專案。 只要主鍵欄未更新,此情況即為 True。
此問題已針對非主要唯一資料行修正。 在此情況下,當更新發生時,只有一個資料列會以「U」做為更新作業來插入,而非兩個具有「D」和「I」的專案。
參考
瞭解 Microsoft 用來描述軟體更新的 術語 。