2012-01-30 70 views
4

我有一张两列的表格,我需要一张(columnB)作为另一张的副本(columnA)。因此,如果插入或更新了一行,我希望将columnA的值复制到columnB如何制作只影响已更新/插入的行的触发器?

这是我现在有:

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

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

回答

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

0

在触发器中有一个特殊的inserted表,它将包含受INSERT或UPDATE操作影响的行的“after”版本。同样,有一个deleted表将包含受UPDATE或DELETE操作影响的行的“before”版本。

因此,对于您的具体情况:

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