我有這兩個表:任務和任務歷史,從名字你可以猜測,我想創建一個歷史的任何事情正在進行的任務。因此,插入或更新的每一行都需要放入歷史記錄表中,只是忽略它被刪除的時間,保持行在歷史記錄中的安全。我的想法是,歷史是原始表格的一個確切副本。SQL Server 2008 - 在插入/更新觸發器,將值複製到另一個表?
我該如何做到這一點?
我有這兩個表:任務和任務歷史,從名字你可以猜測,我想創建一個歷史的任何事情正在進行的任務。因此,插入或更新的每一行都需要放入歷史記錄表中,只是忽略它被刪除的時間,保持行在歷史記錄中的安全。我的想法是,歷史是原始表格的一個確切副本。SQL Server 2008 - 在插入/更新觸發器,將值複製到另一個表?
我該如何做到這一點?
很簡單...
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
你不妨把日期時間信息到歷史表了。我也會記錄刪除操作,否則無法確定某個特定時間點的表的狀態。 – Rory 2011-04-09 17:33:28
這是一個好主意,可惜我沒有足夠的知識把它付諸實踐。 – 2011-04-10 13:23:18
例如只需使用默認值getDate()在歷史記錄表中添加另一列即可。 – Rory 2011-04-11 12:50:02