2013-05-06 21 views
0

我有以下觸發器將更改保存到日誌表中。但是,它不會捕獲觸發觸發器的更改嗎?還是有另一種解決方案?changetable在觸發器中沒有電流變化?

alter trigger trigger_xxx on table1 after delete, update, insert 
as 
begin 
    declare @lastVersion bigint = coalesce((select max(SYS_CHANGE_VERSION) from [log]), 0) 

    insert into [log] 
     ([SourceColumnDescriptionPattern], SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION, SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT) 
    SELECT [SourceColumnDescriptionPattern], SYS_CHANGE_VERSION, SYS_CHANGE_OPERATION, SYS_CHANGE_COLUMNS, SYS_CHANGE_CONTEXT 
    FROM changetable(changes [table1], @lastVersion) as ct 
end 
+0

你只想插入/刪除記錄插入日誌?什麼是「可更改」(更改[table1],@lastVersion)? – 2013-05-06 20:42:00

回答

1

更改跟蹤旨在用於同步目的。例如,您可以使用它來查找是否需要刷新應用程序端緩存。因此,您不希望在事務提交之前顯示該信息。當您的觸發器在事務中執行時,更改不可見。

你爲什麼試圖複製變更跟蹤中可用的信息?你不能僅僅使用這些函數和DMV而不是自己的?

假設你有一個很好的理由,你最好的選擇是使用觸發器,並將其自己的相關信息(如時間戳)與其他相關信息一起捕獲。然而,沒有真正的好方法來強制執行該觸發器在所有其他觸發器之前執行,因此您仍然可能在相同的情況下結束。你可以在你的情況下嘗試使用sp_settriggerorder:http://msdn.microsoft.com/en-us/library/ms186762.aspx在你的情況下它可能已經足夠了。

+0

是否將保存期限設定了很長時間?或者只關閉AUTO_CLEANUP? – ca9163d9 2013-05-06 22:32:59

+0

我對超大型變更數據集沒有經驗。有可能會有性能影響,所以你應該做一些測試。但是,將數據保留幾天應該沒問題。如果看到性能問題,則可以使用SQL代理作業定期將數據傳輸到表中。 – 2013-05-07 12:34:09

+0

是的,我想創建一個代理人的工作,並啓動觸發器的工作。 – ca9163d9 2013-05-07 15:21:03