1

トリガーを持つビューがありINSTEAD OF 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;
    }
}

私の質問は次のとおりです。RAISERRORトリガー内で使用して、番号 2627 または 2601 の例外を作成できますか?

4

2 に答える 2

1

いいえ。次のリリースで THROWを待つ必要があります(おそらく)

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

ビューが複雑すぎて DRI を使用できない場合は、複雑すぎます。また、並行性の問題もあります。呼び出し重複すると、独自のロールを作成するときに「一意性」が失われます。

于 2011-10-28T09:45:30.230 に答える
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
    }
}
于 2011-10-28T09:48:21.800 に答える