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

关于SQL Server 2008 - 在插入/更新触发器上将值复制到另一个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5605362/

相关文章:

sql-server - VarChar 的最大行大小(MAX)

sql-server - 'end of file.' 附近的语法不正确 Expecting CONVERSATION, or TRY

sql - 如何深度复制一组数据,并将 FK 引用更改为指向所有副本?

java - java可以处理由MS SQL Server RAISEERROR命令引起的异常吗?

mysql - 对 INT 字段执行 LIKE 比较

java - 从hibernate sql join获取多个实体

sql - 使用两个数据库创建查询

c# - 在数据库中存储 HTML 格式的文本

sql - 时态表中的计算列

javascript - Sequelize 查询 SELECT * FROM Table 只返回一行