SQL Server 2008-在将值复制到另一个表的Insert/Update触发器上?

SQL Server 2008-在将值复制到另一个表的Insert/Update触发器上?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有两个表:Tasks和TasksHistory,从名称上你可以猜到我想创建一个Tasks中发生的所有事情的历史记录。因此,每一个插入或更新的新行都需要进入历史记录表,在删除时忽略它,以确保该行在历史记录中的安全。我的想法是历史应该是原始表格的精确复制品 我怎样才能做到这一点?很简单 CREATE TRIGGER TRG_Tasks_UI ON Tasks FOR INSERT,UPDATE AS SET XACT_ABORT, NOCOUNT ON --Ignore zero row upd

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

我怎样才能做到这一点?

很简单

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

您也可以将日期时间信息放入历史记录表中。我也会记录删除,否则您无法确定表在特定时间点的状态。这是一个好主意,可惜我没有足够的知识将其付诸实践。只需在历史记录表中添加另一列,默认值为getDate。。。无法正确处理对空值的更改?正确,忘记了这一点,对不起,我无法使其正常工作,您能用实际列举例说明吗?第一个是自动递增PK,列为:ID、标题、消息、cd_usario、状态、完成、优先级、DueDate、所有者、分配、DateModified、DateCreatedSays“Key”附近的语法不正确。然后,当我把它改为“ID”时,我插入的每一列都会在下面弹出一条扭曲的红线,好像它完全错了一样,在列名附近表示无效语法。另外,由于我从未使用过RAISEERROR,所以我在谷歌上搜索了它并使用了:RAISEERROR'some error',16,1