2014-11-06 40 views
0

我正在使用SQL Server 2014的更改跟蹤功能來同步應用程序的內部狀態與數據庫,但遇到了一些意外的行爲。SQL Server ChangeTable返回插入的行不存在

我目前的存儲過程是基於MSDN的例子在這裏:http://msdn.microsoft.com/en-us/library/bb933874.aspx

什麼似乎發生是SYS_CHANGE_OPERATION是一個「我」指插入一個主鍵,但如果我與實際表連接不存在那裏的數據 - 更改表上的主鍵被設置,但表中的主鍵本身和所有其他列爲空。

這會導致應用程序端發生一些解析錯誤,因爲我認爲這種情況是不可能的?如果數據尚未被插入,它肯定不應該報告插入?

我的事務隔離級別是讀取提交的,具有快照隔離和讀取已啓用的快照,如MSDN所建議的。

回答

1

原來,這不是跟蹤變更的問題,而是與另一個表執行內部聯接,然後是對可變表執行外部聯接的結果。

在這種情況下,內連接沒有返回行(在另一個表中缺少外鍵),並且具有可變表的外連接導致'空'插入(除變更表列外的所有列都爲null),如這個問題。

解決的辦法是離開查詢作爲只不過是添加額外的,其中約束:

WHERE MY.PrimaryKey IS NOT NULL OR CT.SYS_CHANGE_OPERATION = 'D' 

這保證了當插入或更新時,並假定應用程序是寬容的主鍵不爲空更新之前沒有發生過插入的地方,因爲我們基本上過濾掉插入並等待內部聯接成功的後續更新。