0

我正在使用 SQL Server 2012

我有一张桌子叫AMOUNTS和一张桌子叫AMOUNTS_HIST

两个表都有相同的列:

  1. 改变日期
  2. 数量
  3. COMPANY_ID
  4. EXP_ID
  5. UPDATE_DATE [系统日期]

的主键AMOUNTS是 COMPANY_ID 和 EXP_ID。主键 pfAMOUNTS_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桌子上什么也没做。任何人都可以帮忙吗?

谢谢,

4

2 回答 2

2

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

尝试将其更改为:

CREATE TRIGGER [MYDB].[update_history] ON [MYDB].[AMOUNTS]
FOR UPDATE, INSERT
于 2012-07-11T17:31:20.940 回答
1

我只是想插话。你看过 CDC(变更数据捕获)吗?

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

变更数据捕获仅适用于 SQL Server 的 Enterprise、Developer 和 Evaluation 版本。”

就您的触发器而言,当您更新 [MYDB].[AMOUNTS] 时,触发器会引发任何错误吗?

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

于 2012-07-11T17:33:32.370 回答