在SQL SERVER 2008中的检查约束中创建自定义错误消息

时间:2011-11-30 05:40:28

标签: sql-server database sql-server-2008 check-constraints

我希望能够将自定义错误消息附加到CONSTRAINT对象,特别是CHECK constrints。直接或通过sysmessages中的自定义错误号。

我已经看到开发者必须创建触发器。我认为这不是实施它的好理由。

我正在使用SQL SERVER 2008。

3 个答案:

答案 0 :(得分:14)

您可以使用用户消息命名约束。

例如:

ADD CONSTRAINT 
[Foo cannot be greater than Bar. Please be sure to check your foos and bars next time.] 
CHECK (foo <= Bar)

答案 1 :(得分:3)

我知道这是一篇旧帖子,但我发现可能会使更容易为最终用户提供更清晰的错误消息以检查约束:检查约束的名称可以包括回车符和换行符,因此可以使错误消息更容易看到。

E.g。创建以下约束会产生以下错误消息。 ([]之间的空白行是有意的,即约束名称的一部分。)

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

当此约束失败时,生成的消息为:

enter image description here

我尝试将标记放在错误消息(即约束名称)中,如<b>message</b>*message*,但无济于事。并且,将此用于外键约束也许是可能的,但实际上并不笨拙。我没试过。

因此,它不是100%的解决方案,但希望用户更容易看到预期的错误消息。

答案 2 :(得分:2)

你不能直接

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)
....