使用SQL Server中的触发器来保留历史记录

时间:2012-07-11 17:19:50

标签: sql-server triggers

我正在使用SQL Server 2012

我有一个名为AMOUNTS的表和一个名为AMOUNTS_HIST

的表

两个表都有相同的列:

  1. CHANGE_DATE
  2. AMOUNT
  3. COMPANY_ID
  4. EXP_ID
  5. SPOT
  6. UPDATE_DATE [系统日期]
  7. AMOUNTS的主键是COMPANY_ID和EXP_ID。 主键pf AMOUNTS_HIST是COMPANY_ID,EXP_ID和CHANGE_DATE

    每当我在AMOUNTS表中添加一行时,我想在AMOUNTS_HIST表中创建它的副本。 [理论上,每次将行添加到“AMOUNTS”时,COMPANY_ID,EXP_ID,CHANGE_DATE将是唯一的。实际上,如果不是,则需要覆盖AMOUNTS_HIST中的相关行。下面的代码不考虑覆盖。]

    我按如下方式创建了一个触发器:

    CREATE TRIGGER [MYDB].[update_history] ON [MYDB].[AMOUNTS]
    FOR UPDATE
    AS
    INSERT MYDB.AMOUNTS_HIST (
        CHANGE_DATE,
        COMPANY_ID,
        EXP_ID,
        SPOT
        UPDATE_DATE
        )
    SELECT e.CHANGE_DATE,
        e.COMPANY_ID,
        e.EXP_ID
        e.REMARKS,
        e.SPOT,
        e.UPDATE_DATE
    FROM MYDB.AMOUNTS e
    JOIN inserted ON inserted.company_id = e.company_id
        AND inserted.exp_id=e.exp_id
    

    我不明白为什么它在AMOUNTS_HIST表中根本没有做任何事情。 有人可以帮忙吗?

    谢谢,

2 个答案:

答案 0 :(得分:2)

可能是因为触发器(当前编写的方式)只会在完成更新时触发,而不是插入。

尝试将其更改为:

CREATE TRIGGER [MYDB].[update_history] ON [MYDB].[AMOUNTS]
FOR UPDATE, INSERT

答案 1 :(得分:1)

我只想插话。你看过CDC(改变数据捕获)。

http://msdn.microsoft.com/en-us/library/bb522489(v=sql.105).aspx “更改数据捕获旨在捕获应用于SQL Server表的插入,更新和删除活动,并以易于使用的关系格式提供更改的详细信息。更改数据捕获使用的更改表包含镜像的列已跟踪源表的列结构,以及了解已发生更改所需的元数据。

更改数据捕获仅适用于SQL Server的Enterprise,Developer和Evaluation版本。“

根据您的触发器,当您更新[MYDB]。[AMOUNTS]触发器是否会抛出任何错误?

此外,我相信您可以从插入表中获取所有数据,而无需将连接重新连接回mydb.amounts。