2012-01-30 5 views
4

私は2つの列を持つテーブルを持っています。もう1つの列(columnA)のコピーには1つ(columnB)が必要です。したがって、行が挿入または更新された場合、columnAの値をcolumnBにコピーします。更新/挿入された行だけに影響を及ぼすトリガーを作成するにはどうすればよいですか?

は、ここで私が今持っているものです。

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

問題は今、クエリはすべての行、更新または挿入されただけでなく1に影響を与えることがあります。私はそれをどうやって修正しようとしますか?

答えて

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操作の影響を受ける行の「後」バージョンが含まれます。同様に、deletedテーブルには、UPDATEまたはDELETE操作の影響を受ける「以前の」バージョンの行が含まれます。

だから、あなたの特定のケースについて:

UPDATE t 
    SET t.columnB = t.columnA 
    FROM inserted i 
     INNER JOIN table t 
      ON i.PrimaryKeyColumn = t.PrimaryKeyColumn 
関連する問題