如何创建仅影响已更新/插入的行的触发器?

时间:2012-01-30 14:40:40

标签: sql-server triggers

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

这就是我现在所拥有的:

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

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

2 个答案:

答案 0 :(得分:5)

假设您有一个主键列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

答案 1 :(得分:0)

触发器中有一个特殊的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