2016-09-29 16 views
0

テーブルの更新後にトリガーがあり、1回のトランザクションで2回の更新があります。最初の更新後にトリガーが呼び出されました。私は、トリガ、ビューの更新は、全体のトランザクションの後、期待していますが、それはまったく真実ではありません:SQL Server:トランザクション後のトリガー

マイ取引:

  1. 更新テーブル
  2. コール・トリガ、トリガが
  3. 1つの
  4. 更新テーブルからのみの更新を参照してください
  5. 3の更新条件が一致しないため、呼び出しトリガーがありません

トリガーを設定してトリガーseトランザクション後のデータ(1から3まで)

マイトリガー:

ALTER TRIGGER "dbo"."TRIGGER" 
ON TABLE 
FOR UPDATE 
AS 
    IF (SELECT COUNT(*) FROM inserted i, deleted d 
     WHERE d.aaa IS NULL 
      AND i.aaa IS NOT NULL 
      AND i.bbb IN ('0', '1', '6', '9')) > 0 
    BEGIN 
     INSERT INTO export (aaa, ccc) 
      (SELECT aaa, ccc FROM inserted) 
    END 

初期データ:insert into TABLE(aaa,bbb,ccc) values(123,'N',100)

更新:

update TABLE set bbb = '0' where aaa = 123 
update TABLE set ccc = 1 where aaa = 123 

期待:insert into export(123,1)

しかし、それは呼び出します。insert into export(123,100)

+2

SQL Serverのトリガは 'set-based'であることに注意してください。したがって、一度に全体のセット(更新)でそのアクションを実行します。トリガーからコードを共有し、このセットベースのアプローチを正しく処理するかどうか確認できますか? – NickyvV

+0

あなたの質問はクリアではありません.iあなたは質問していると仮定します。「あなたは1つのトランザクションで2つの更新を持っていますが、トリガーを同じテーブルのみで2回更新するようにしますか? – TheGameiswar

+0

(3)がテーブルにそれ以上の変更を行わない場合、(2)のトリガで観察されたテーブルは(4)と同じです。私は問題が何であるか理解していない。 –

答えて

1

あなたの問題があります。

ただし、SQL Serverのトリガーはステートメントレベルですが、不幸にもここで期待するように動作しません。おそらく、テーブルに "コントロール"カラムを追加して(トランザクションの最後に更新してロジックを作成する)、context_infoを使用して動作させることができますが、実際にIMHOの匂いがします。

トリガから離れ、メインスコープからエクスポートテーブルに挿入すると、最適なオプションです。

関連する問題