2011-10-28 6 views
1

私はINSTEAD OF INSERTトリガを持つビューを持っています(SQL Server 2005で)。ユーザーがビューに挿入すると、実際には多数のテーブルに挿入と更新が行われます。ビューは十分に複雑であり、インデックスを持てないので、残念ながら制約はありません。RAISERRORを使用してt-SQLで特定のエラーを発生させます

ビューは、変更に問題があるコードを使用してC#から挿入されています。このコードは、以下のものを使用して、プライマリおよびユニークキー違反をキャッチ:

try 
{ 
    ... // Insert into view 
} 
catch (SqlException ex) 
{ 
    if (ex.Number == 2627 || ex.Number == 2601) // Primary key exception, unique constraint violation 
    { 
     ... // Report the duplicate entry to the user 
    } 
    else 
    { 
     throw; 
    } 
} 

だから私の質問です:私は数2627または2601で例外を作成するために私のトリガー内RAISERRORを使用することができますか?

答えて

1

いいえあなたは(たぶん)THROW in the next releaseを待つ必要があるでしょう

あなたはあなただけは、または50000を与えるかに埋め込むテキストでsys.messages(50000+)に入れたエラーを投げることができるしテキストとあなたのC#を変更します。 0120より小さいエラーを投げることはできません

ビューが非常に複雑でDRIを使用できない場合は、でもという複雑なものです。また、並行処理の問題が発生します。オーバーラップするコールあなた自身をロールバックするときに、あなたの「一意性」を壊します。

+0

おかげで、けっこうだ。私が理解しているのは、左結合も、共用体も、サブクエリもない場合にのみ、SQL Server 2005でスキーマ・バインド・ビューを索引付けできるということです。私の意見では、これらは必ずしも複雑すぎるとは限りません。 – Paul

+0

@Paul:インデックス付きのビューを維持するには、これらのコンストラクトで多くの処理が必要になるためです。 「インデックス付きビューでOUTER JOINを使用できないのはなぜですか?」を参照してください。 in http://msdn.microsoft.com/en-us/library/dd171921%28SQL.100%29.aspx – gbn

+0

申し訳ありませんが、私はビューとして役立つにはあまりにも複雑であることを意味しました.SQL Serverがインデックスを維持するにはそれほど複雑ではありません。私の場合、ビューには外部結合はありませんが、ROW_NUMBER()関数の結果に基づいて制限できるようにサブクエリがあります。 – Paul

0

実際にRAISE本物の主キー違反が可能かどうかはわかりません。あなたは自分のメッセージでRAISEあなた自身のエラーをすることができますが、それからcatchです。これにより、本物の主キー違反と独自のカスタム違反を区別することもできます。

おそらく、これを達成する最も生々しい方法は...

SQLコード(多分TRIGGER定義で)だろう...

RAISERROR('Custom View Violation',16,1); 

C#の...

try 
{ 
    //execute SP/Insert etc... 
} 
catch (SqlException ex) 
{ 
    if (ex.Message.Split('\r')[0] == "Custom View Violation") 
    { 
     //deal with your exception 
    } 
} 
+0

ありがとうございました。プライマリキーエラーを発生させることができない場合、これは私が必要とするものです。代わりに、私はプライマリキーを持つ一時テーブルに2つの同一の値を挿入することによって、本物のプライマリキー違反を引き起こす可能性があります...どちらも少しハッキーのように見えます:-S – Paul

+0

@Paulええ、彼らは少しハッキーです - 私の投稿のメソッドは、あなたが提案する二重のINSERTよりもハッキリではありません。また、RAISEの誤った読み込みと例外のキャッチにはRAISERRORの読み書きに最適な方法があると確信しています。 –

+0

はい、同意しました。 [複数キャラ合わせ] – Paul

関連する問題