11

私は以下のトリガーを持っています:

  CREATE Trigger instructor_expertise on CourseSections
     After Insert
     As Begin
     ......

     If (Not Exists(Select AreaName From AreasOfInstructor Where (InstructorNo = @InstructorNo AND AreaName = @AreaName))) 
     Begin 
     RAISERROR('Course not in instructors expertise', 16, 1)
     rollback transaction  
     End
     GO

私の質問は、「ロールバックトランザクション」は行を削除しますか?代わりに「挿入用」の場合、「ロールバックトランザクション」はその場合に行を削除しますか?

ありがとう!!!

4

2 に答える 2

19

ステートメントINSERTは常にトランザクションで実行されます。明示的に定義したか、定義していない場合、SQLServerは暗黙的なトランザクションを使用します。

テーブルに1つ(または複数)の行を挿入しています。次に、-まだトランザクション内で-AFTER INSERTトリガーが実行され、特定の条件をチェックします-通常、Inserted挿入された行を含むトリガー内で使用可能な疑似テーブルを使用します。

トリガーを呼び出すとROLLBACK TRANSACTION、はい-トランザクションは、実行中のすべてのものとともにロールバックされ、それがINSERT決して起こらなかったかのようになります-データベーステーブルには何も表示されません。

また、SQL ServerFOR INSERTの場合と同じです。AFTER INSERTトリガーは、ステートメントがそのジョブを実行した後に実行されます。INSERT

覚えておくべき1つのこと(多くのプログラマーは間違っています):トリガーはステートメントごとに1回起動されます-行ごとに1回ではありません!したがって、一度に20行を挿入すると、トリガーが1回起動され、トリガー内のInserted疑似テーブルに20行が含まれます。トリガーを作成するときは、これを考慮する必要があります。挿入される1つの行だけを処理しているとは限りません。

于 2012-11-14T06:25:00.037 に答える
0

いいえ、行が存在しない場合はbeginブロックに入るため、不可能です...

于 2012-11-14T05:51:09.620 に答える