SQL Server 2008 - 在插入/更新触发器上将值复制到另一个表?

时间:2011-04-09 13:39:25

标签: sql sql-server sql-server-2008

我有这两个表:Tasks和TasksHistory,从您可以猜到的名称,我想创建一个在Tasks中发生的所有事情的历史记录。因此,插入或更新的每个新行都需要进入历史表,只是忽略它被删除时,保持行在历史记录中是安全的。我的想法是,历史记录是原始表格的精确副本

我怎样才能做到这一点?

1 个答案:

答案 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