我是触发器的新手,想要在更新列时创建触发器并使用该值更新另一个表。
我有一个带有年份列的table1,如果应用程序更新该年份列,我需要在同一年更新表2。
ALTER TRIGGER [dbo].[trig_UpdateAnnualYear]
ON [dbo].[table1]
AFTER UPDATE
AS
if (UPDATE (intAnnualYear))
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
Update table2 set AnnualYear = intAnnualYear where table2.ID = table1.ID
END
答案 0 :(得分:24)
您没有在触发器中引用table1
。使用inserted
伪表来获取“after”值。还要记住,更新可能会影响多行。
所以用
替换当前的update
语句
UPDATE table2
SET table2.annualyear = inserted.intannualyear
FROM table2
JOIN inserted
ON table2.id = inserted.id
答案 1 :(得分:9)
如果涉及intannualyear列,则只需更新table2中的记录。此外,这是Martin展示的两个表中的替代UPDATE语法
IF UPDATE(intannualyear)
UPDATE table2
SET annualyear = inserted.intannualyear
FROM inserted
WHERE table2.id = inserted.id
答案 2 :(得分:1)
根据this question,如果只有一个“下游”表,那么具有正确定义的外键关系的另一个选项将是级联更新。
答案 3 :(得分:0)
要补充上述答案,如果必须检查多个列,可以在插入和删除之间使用INNER JOIN,或者使用多个UPDATE()调用:
IF ( UPDATE(Col1) OR UPDATE(Col2) ) BEGIN ...