2012-11-14 26 views
6

私は下記のトリガーがあります。SQL Serverの - を挿入するために挿入/後 - ロールバック

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 

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

ありがとうございました!

ない
+0

@MitchWheat:トランザクションは常に存在する - いいえ?明示的または暗黙的です。そして、ロールバックはそのトランザクションを終了させ、このトランザクションがテーブルに対して何をしようとしていたものを元に戻します。 –

+1

はい、申し訳ありませんマークさん、それは正しいです。私は明示的な取引を意味しました。私は水を混乱させるかもしれないと思う...私は前のコメントを削除します。 –

+0

これらの値はどこから '@ InstructorNo'と' @ AreaName'を取得しますか?基本的には、あなたのトリガで 'ROLLBACK TRANSACTION'を呼び出すと**あなたのINSERTを止めて中断します**全く行が挿入されません –

答えて

13

あなたINSERT文は常にトランザクションで実行されるため、それは可能ではない - のいずれか、あなたが明示的に定義した、またはそうでない場合SQL Serverは暗黙的なトランザクションを使用します。

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

あなたのトリガーでROLLBACK TRANSACTIONを呼び出す場合は、[はい] - あなたのトランザクションが、それはやっていますすべてのもので、はバック圧延され、それはそのINSERTは決して起こらなかったかのようだ - 何があなたのデータベーステーブルに現れません。また

FOR INSERTは、SQL ServerでAFTER INSERTと同じである - トリガはINSERT文がその仕事をしている後に実行されます。 (プログラマの多くが誤解した)心に留めておくべき

一つのこと:トリガーがバッチごとに一度発射される - 行ごとに一度ませ!したがって、一度に20行を挿入すると、トリガーが起動されますInsertedトリガー内の疑似テーブルには20行が含まれています。あなたは、トリガーを書くときにそれを考慮する必要があります - あなたはではなく、は常に1つの行が挿入されているだけです!

+1

+1。特にバッチビットの場合! :) –

0

何それはブロックの開始で行く何行彼らが存在していないとき...

+1

からの返信ありがとう!どのように行を追加するのを防ぐ必要がありますか? – zoe

関連する問題