15

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

我见过开发人员必须创建触发器。我认为这不是实施它的好理由。

我正在使用 SQL SERVER 2008。

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>and *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 回答