Создайте пользовательское сообщение об ошибке в проверочных ограничениях в SQL SERVER 2008 - PullRequest
13 голосов
/ 30 ноября 2011

Я бы хотел видеть возможность прикреплять пользовательские сообщения об ошибках к объектам CONSTRAINT, в частности, к ограничениям CHECK. Либо напрямую, либо через пользовательский номер ошибки в sysmessages.

Я видел, как разработчики должны создавать триггеры. Я думаю, что это не очень хорошая причина для его реализации.

Я использую SQL SERVER 2008.

Ответы [ 3 ]

14 голосов
/ 16 октября 2012

Вы можете назвать свое ограничение с помощью пользовательского сообщения.

Например:

ADD CONSTRAINT 
[Foo cannot be greater than Bar. Please be sure to check your foos and bars next time.] 
CHECK (foo <= Bar)
3 голосов
/ 24 ноября 2015

Я знаю, что это старый пост, но я нашел кое-что, что может сделать его бит более простым для предоставления более четких сообщений об ошибках для проверочных ограничений для конечного пользователя: имена проверочных ограничений могут включайте возврат каретки и перевод строки, поэтому сообщение об ошибке может быть немного легче увидеть.

например. Создание следующего ограничения приводит к появлению сообщения об ошибке ниже. (пустые строки между [ и ] являются преднамеренными, то есть они являются частью имени ограничения .)

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 голосов
/ 30 ноября 2011

Вы не можете напрямую

Сбой 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)
....
...