【问题标题】:How do I make a trigger that only affects the row that was updated/inserted?如何制作仅影响已更新/插入的行的触发器?
【发布时间】:2025-12-14 20:00:01
【问题描述】:

我有一个包含两列的表,我需要其中一列 (columnB) 作为另一列 (columnA) 的副本。因此,如果插入或更新一行,我希望将 columnA 中的值复制到 columnB

这是我现在拥有的:

CREATE TRIGGER tUpdateColB
ON products
FOR INSERT, UPDATE AS
    BEGIN
        UPDATE table
        SET columnB = columnA
    END

现在的问题是查询会影响所有行,而不仅仅是更新或插入的行。我将如何解决这个问题?

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    假设您有一个主键列id,(并且您应该有一个主键),加入inserted 表(使触发器能够处理多行):

    CREATE TRIGGER tUpdateColB 
    ON products 
    FOR INSERT, UPDATE AS 
        BEGIN 
            UPDATE table 
            SET t.columnB = i.columnA 
            FROM table t INNER JOIN inserted i ON t.id = i.id
        END 
    

    但如果 ColumnB 始终是 ColumnA 的副本,为什么不创建一个 Computed column 来代替?

    Using the inserted and deleted Tables

    【讨论】:

      【解决方案2】:

      触发器中有一个特殊的inserted 表可用,其中包含受 INSERT 或 UPDATE 操作影响的行的“之后”版本。同样,deleted 表将包含受 UPDATE 或 DELETE 操作影响的行的“之前”版本。

      所以,针对您的具体情况:

      UPDATE t
          SET t.columnB = t.columnA
          FROM inserted i
              INNER JOIN table t
                  ON i.PrimaryKeyColumn = t.PrimaryKeyColumn
      

      【讨论】: