2014-01-24 63 views
1

我目前在SQL Server 2008測試變更跟蹤機制跟蹤並發現了一些:更改SQL Server 2008中,毫無意義的刪除操作

當基表(其他城市跟蹤)我插入一個新的記錄,並使用刪除同樣的 鍵,選擇與改變返回給我的信息,它應該在遠程表中刪除,但該記錄根本不存在在該表中。

爲什麼它的功能是這樣?

示例代碼:

CREATE TABLE TEST (
    ID UNIQUEIDENTIFIER primary key, 
    value int 
) 

ALTER TABLE [dbo].Test 
ENABLE CHANGE_TRACKING 

SELECT CHANGE_TRACKING_CURRENT_VERSION() 

SELECT CT.SYS_CHANGE_OPERATION, CT.ID, IV.value 
    FROM CHANGETABLE(CHANGES TEST, 51374) CT 
    LEFT JOIN TEST IV ON IV.ID = CT.ID 

--zero changes now for: 51374 

insert into Test VALUES ('54C1D80E-ACB0-433F-94DF-7D06FE809E22', 1) 
delete from Test where id = '54C1D80E-ACB0-433F-94DF-7D06FE809E22' 

select * from Test -- table is empty (insert and delete) 

SELECT CT.SYS_CHANGE_OPERATION, CT.ID, IV.value 
    FROM CHANGETABLE(CHANGES TEST, 51374) CT 
    LEFT JOIN TEST IV ON IV.ID = CT.ID 

--however for Anchor: 51374 it claims I should delete the record ... 

我的基座和遠程表都同步於51374錨。 添加和刪除記錄不應該給我的信息刪除 的東西,我沒有在我的遠程表...

+0

這就是文檔中的所有內容,真正「只需要一行已更改的事實,而不是行已更改的次數或任何中間更改的值」,「如果應用程序需要有關所有更改和已更改數據的中間值,使用更改數據捕獲,而不是更改跟蹤「 –

+0

我不需要所有更改的信息,但是當ID:1的行已被插入並刪除在時間x(客戶端在時間x處錨定)之後,爲什麼「更改跟蹤」給了我信息,我應該刪除一些我沒有的信息......我不明白。 – John

+0

想象一下,如果你有一行ID 1,你知道。然後在某個時期,某人進入並刪除該行,然後添加具有相同ID的新行。即使您已經知道ID爲1的行並且沒有看到刪除,更改跟蹤也會爲您提供插入。這是野獸的本質 - 你只能得到最後的改變,你必須與你的現實版本調和。如果你看到一行你不知道的刪除行,*忽略它*。 –

回答

0

我認爲達米安的答案是正確的。不知道他爲什麼回答評論。

這一切都沒有在文檔中,真的「只有一個事實,即行 改變是必需的,沒有多少次該行已變更或 值的任何中間的變化。」,「如果一個應用程序需要 有關所做的所有更改的信息以及更改數據的中間值 ,使用更改數據捕獲而不是 更改跟蹤。「

想象一下,如果你有一行ID 1,你知道。然後在某個 期間,某人進入並刪除該行,然後添加具有相同ID的新行 。更改跟蹤會給你一個插入,即使 你已經知道ID爲1的行並沒有看到刪除。它是 野獸的性質 - 你只能得到最後的變化,並且你有 與你的現實版本相協調。如果您看到一個您不知道的行的刪除 ,請忽略它。