RAISERRORを使用してt-SQLで特定のエラーを発生させる

INSERT トリガ(SQL Server 2005)のビューを持っています。ユーザーがビューに挿入すると、実際には多数のテーブルに挿入と更新が行われます。ビューは十分に複雑であり、インデックスを持てないので、残念ながら制約はありません。

ビューは、変更に問題があるコードを使用して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

2 答え

いいえ、あなたは次のリリースでの使用(多分)

エラーは、sys.messages(50000+)、または50000を与えるテキストでのみスローすることができます。または、テキストに埋め込み、C#を変更します。あなたは50000未満のエラーを投げることはできません

ビューが複雑すぎてDRIを使用できない場合は、複雑すぎる 。また、並行処理の問題が発生します。オーバーラップしているコールは、自分のロールバック時に「一意」を破ることになります。

1
追加された
@Paul:インデックス付きのビューを維持するには、これらのコンストラクトで大量の処理が必要になるためです。 「インデックス付きビューでOUTER JOINを使用できないのはなぜですか?」を参照してください。 msdn.microsoft.com/en-us/library /dd171921%28SQL.100%29.aspx
追加された 著者 gbn,
@Paul:ROW_NUMBER()は、インデックス付きビュー全体を再計算する必要があります(ORDER BYでの場所/削除の変更、パーティションの変更など)。インデックス付きビューの制限には、十分な理由があります。
追加された 著者 gbn,
ありがとう、十分に公正。私が理解しているのは、左結合も、共用体も、サブクエリもない場合にのみ、SQL Server 2005でスキーマ・バインド・ビューを索引付けできるということです。私の意見では、これらは必ずしも複雑すぎるとは限りません。
追加された 著者 Paul,
申し訳ありませんが、ビューとして役立つにはあまりにも複雑すぎます。インデックスを維持するにはあまり複雑ではありません。私の場合、ビューには外部結合はありませんが、ROW_NUMBER()関数の結果に基づいて制限できるようにサブクエリがあります。
追加された 著者 Paul,

実際にプライマリキーの違反を 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つの同一の値を挿入することによって、本物のプライマリキー違反を引き起こす可能性があります...どちらも少しハッキリです:
追加された 著者 Paul,
はい、合意しました。 [といくつかの文字]
追加された 著者 Paul,
@Paulええ、彼らはちょっとハッキーです。私の投稿のメソッドは、あなたが提案する INSERT よりもハッキリではないと言っています。私はまた、 RAISE のインサイドとアウトについて読みやすくするために、エラーを受け取り、あなたの特定の例外をキャッチするより良い方法があると確信しています。 。
追加された 著者 El Ronnoco,
:)フィラーフィラーフィラー
追加された 著者 El Ronnoco,