我正在使用SQL Server 2012
我有一个名为AMOUNTS
的表和一个名为AMOUNTS_HIST
两个表都有相同的列:
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
表中根本没有做任何事情。
有人可以帮忙吗?
谢谢,
答案 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。