カスタムエラーメッセージをCONSTRAINTオブジェクト、特にCHECK制約に添付する機能が必要です。直接またはsysmessagesのカスタムエラー番号を介して。
開発者がトリガーを作成する必要があるのを見てきました。それはそれを実装する良い理由ではないと思います。
SQLSERVER2008を使用しています。
カスタムエラーメッセージをCONSTRAINTオブジェクト、特にCHECK制約に添付する機能が必要です。直接またはsysmessagesのカスタムエラー番号を介して。
開発者がトリガーを作成する必要があるのを見てきました。それはそれを実装する良い理由ではないと思います。
SQLSERVER2008を使用しています。
ユーザーメッセージを使用して制約に名前を付けることができます。
例えば:
ADD CONSTRAINT
[Foo cannot be greater than Bar. Please be sure to check your foos and bars next time.]
CHECK (foo <= Bar)
これは古い投稿ですが、チェック制約のより明確なエラーメッセージをエンドユーザーに提供するのが少し簡単になる可能性があるものを見つけました。チェック制約の名前には、キャリッジリターンとラインフィードを含めることができます。エラーメッセージを少し見やすくすることができます。
たとえば、次の制約を作成すると、以下のエラーメッセージが生成されます。[
(との間の空白行]
は意図的なものです。つまり、制約名の一部です。)
ALTER TABLE dbo.Sales WITH CHECK ADD CONSTRAINT [
ERROR:
You have stupidly entered a negative selling price. Please report to detention.
] CHECK ([SellingPrice] >= 0.00)
GO
そして、この制約が失敗すると、結果のメッセージは次のようになります。
<b>message</b>
とのように、エラーメッセージ(つまり制約名)にマークアップを入れてみました*message*
が、役に立ちませんでした。また、これを外部キー制約にも使用することは可能かもしれませんが、実際には扱いにくいです。私はそれを試していません。
したがって、これは100%の解決策ではありませんが、ユーザーが意図したエラーメッセージを簡単に確認できることを願っています。
編集(2022-02-09):データベースオブジェクト名はsysnameデータ型を使用して保存されるため(このページで「sysname」を検索)、128文字を超えることはできません。短いエラーメッセージを使用する
直接することはできません
CHECK制約は、標準のエラーメッセージで失敗します。TRY / CATCHブロックを使用してエラーを解析し、独自の(RAISERROR)をスローするか、トリガーを使用できます。
SQLまたはクライアントコードのいずれかで起動しないように、最初に確認します。そしてもちろん、データの整合性を保護するために制約を残します
したがって、制約がある場合
ALTER TABLE MyTable WITH CHECK
ADD CONSTRAINT CK_MyTable_foobar CHECK (@foo <= @Bar)
クライアントコードで次のSQLコードまたは同等のものを実行します。
...
IF @foo > @bar
RAISERROR ('foo (%i) can not be greater than bar (%i)', 16, 1, @foo, @bar)
INSERT MyTable (foo, bar) VALUES (@foo, @bar)
....