15

カスタムエラーメッセージをCONSTRAINTオブジェクト、特にCHECK制約に添付する機能が必要です。直接またはsysmessagesのカスタムエラー番号を介して。

開発者がトリガーを作成する必要があるのを見てきました。それはそれを実装する良い理由ではないと思います。

SQLSERVER2008を使用しています。

4

3 に答える 3

18

ユーザーメッセージを使用して制約に名前を付けることができます。

例えば:

ADD CONSTRAINT 
[Foo cannot be greater than Bar. Please be sure to check your foos and bars next time.] 
CHECK (foo <= Bar)
于 2012-10-16T17:56:32.607 に答える
7

これは古い投稿ですが、チェック制約のより明確なエラーメッセージをエンドユーザーに提供するのが少し簡単になる可能性があるものを見つけました。チェック制約の名前には、キャリッジリターンとラインフィードを含めることができます。エラーメッセージを少し見やすくすることができます。

たとえば、次の制約を作成すると、以下のエラーメッセージが生成されます。[(との間の空白行]は意図的なものです。つまり、制約名の一部です。)

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文字を超えることはできません。短いエラーメッセージを使用する

于 2015-11-24T15:34:23.163 に答える
3

直接することはできません

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)
....
于 2011-11-30T06:16:32.220 に答える