我有这两个表:Tasks和TasksHistory,从您可以猜到的名称,我想创建一个在Tasks中发生的所有事情的历史记录。因此,插入或更新的每个新行都需要进入历史表,只是忽略它被删除时,保持行在历史记录中是安全的。我的想法是,历史记录是原始表格的精确副本。
我怎样才能做到这一点?
答案 0 :(得分: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