2011-04-09 108 views
2

我有這兩個表:任務和任務歷史,從名字你可以猜測,我想創建一個歷史的任何事情正在進行的任務。因此,插入或更新的每一行都需要放入歷史記錄表中,只是忽略它被刪除的時間,保持行在歷史記錄中的安全。我的想法是,歷史是原始表格的一個確切副本SQL Server 2008 - 在插入/更新觸發器,將值複製到另一個表?

我該如何做到這一點?

+1

你不妨把日期時間信息到歷史表了。我也會記錄刪除操作,否則無法確定某個特定時間點的表的狀態。 – Rory 2011-04-09 17:33:28

+0

這是一個好主意,可惜我沒有足夠的知識把它付諸實踐。 – 2011-04-10 13:23:18

+0

例如只需使用默認值getDate()在歷史記錄表中添加另一列即可。 – Rory 2011-04-11 12:50:02

回答

4

很簡單...

CREATE TRIGGER TRG_Tasks_UI ON Tasks FOR INSERT,UPDATE 
AS 
SET XACT_ABORT, NOCOUNT ON 

--Ignore zero row updates, inserts 
IF NOT EXISTS (SELECT * FROM INSERTED) RETURN; 

BEGIN TRY 
    INSERT TasksHistory 
     (col1, col2, ...) 
    SELECT 
     I.* 
    FROM 
     INSERTED I 
     LEFT JOIN 
     DELETED D ON I.key = D.Key 
    WHERE 
     D.Key IS NULL --insert only 
     OR -- need null handling here 
     I.col1 <> D.col1 OR I.col2 <> D.col2 OR ...; 
END TRY 
BEGIN CATCH 
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION 
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc] 
END CATCH 
GO 
+0

我認爲你的'I.col1 <> D.col1 ...'不會正確處理NULL值的變化。 – Rory 2011-04-09 17:34:49

+0

正確,忘記了那個對不起 – gbn 2011-04-09 18:59:29

+0

我無法使它工作,你能舉例說明真正的專欄嗎?第一個是自動遞增PK,列是:ID,標題,消息,cd_usario,狀態,完成,優先級,DueDate,所有者,分配,DateModified,DateCreated – 2011-04-10 02:37:50

相關問題