【问题标题】:How to use update trigger to update another table?如何使用更新触发器更新另一个表?
【发布时间】:2011-07-12 06:54:58
【问题描述】:

我是触发器的新手,想在更新列时创建触发器并使用该值更新另一个表。

我有一个带有年份列的表 1,如果应用程序更新该年份列,我需要用同一年的年份更新表 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

【问题讨论】:

    标签: sql sql-server-2008 triggers sql-update


    【解决方案1】:

    您没有在触发器内引用table1。使用inserted 伪表获取“之后”值。另请记住,更新可能会影响多行。

    因此,将您当前的 update 语句替换为

    UPDATE table2
    SET    table2.annualyear = inserted.intannualyear
    FROM   table2
           JOIN inserted
             ON table2.id = inserted.id  
    

    【讨论】:

      【解决方案2】:

      如果涉及到intannualyear 列,则只需要更新table2 中的记录。此外,这是 Martin 所展示的跨两个表的替代 UPDATE 语法

      IF UPDATE(intannualyear)
          UPDATE table2
          SET    annualyear = inserted.intannualyear
          FROM   inserted
          WHERE table2.id = inserted.id
      

      【讨论】:

      【解决方案3】:

      根据this question,如果只有一个“下游”表,那么另一个具有正确定义的外键关系的选项将是级联更新。

      【讨论】:

        【解决方案4】:

        作为对上述答案的补充,如果您必须检查多个列,您可以在插入和删除之间使用 INNER JOIN,或者多次 UPDATE() 调用:

        IF ( UPDATE(Col1) OR UPDATE(Col2) ) BEGIN ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          相关资源
          最近更新 更多