Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
Dmitry Trofimov
Member

Откуда: Киев
Сообщений: 72
Привет!
SQL 2005, 2008

Можно, чтобы вместо стандартной ошибки:
Violation of PRIMARY KEY constraint 'table' Cannot insert duplicate key in object table

Выдало мою, например: "Ошибка вставки кода продукции. такой продукт существует"?
28 авг 09, 13:01    [7590351]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну так и обрабатівайте сами ошибки,а не ждите пока сервер начнет ругаться
-------------------------------------
Jedem Das Seine
28 авг 09, 13:03    [7590367]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Сервер понятия не имеет, что у Вас там за продукты. Проверяйте сами ограничения бизнес-логики и выдавайте соответствующее сообщение об ошибке.
28 авг 09, 13:07    [7590399]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
san_d
Member

Откуда: Киев
Сообщений: 60
if exists(select * from Products where code = @code) begin
 raiserror('Ошибка вставки кода продукции. такой продукт существует',16,1)
 goto exit_err--наверна..
end

а вообще код продукта пользователь наверно не сам придумывает. Значит в вашей системе где-то хромает логика при генерации нового кода продукта(или нет блокировки нового кода при вводе нового продукта)
28 авг 09, 13:11    [7590431]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
BEGIN TRY
    --попытка
END TRY
BEGIN CATCH
    --надеемся что случилось "Ошибка вставки кода продукции. такой продукт существует"?
END CATCH;

раз у вас SQL 2005, 2008
28 авг 09, 13:13    [7590447]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Dmitry Trofimov,

1/2 OFF. Откажитесь от естественных ключей.
28 авг 09, 13:19    [7590493]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
Dmitry Trofimov
Member

Откуда: Киев
Сообщений: 72
san_d
if exists(select * from Products where code = @code) begin
 raiserror('Ошибка вставки кода продукции. такой продукт существует',16,1)
 goto exit_err--наверна..
end

а вообще код продукта пользователь наверно не сам придумывает. Значит в вашей системе где-то хромает логика при генерации нового кода продукта(или нет блокировки нового кода при вводе нового продукта)


Ок, спасибо, будем через try catch решать.
28 авг 09, 13:19    [7590496]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Я не совсем понял, что значит
DENIS_CHEL
    --надеемся что случилось "Ошибка вставки кода продукции. такой продукт существует"?

возможно, автору будет полезен ERROR_NUMBER (Transact-SQL)
28 авг 09, 13:19    [7590497]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Паганель
Я не совсем понял, что значит
DENIS_CHEL
    --надеемся что случилось "Ошибка вставки кода продукции. такой продукт существует"?

возможно, автору будет полезен ERROR_NUMBER (Transact-SQL)


Если в блоке CATCH просто выводить свое сообщение об ошибку, не анализируя причины, то самописное сообщение может не соответствовать причине ошибки, вот это я и имел ввиду…

PS если автор добавит ваше предложение к своему решению, то это как раз и устранит недостаток блока использования TRY\CATCH …
28 авг 09, 13:30    [7590577]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18323
Было бы совсем не плохой фишкой возможность подменять текст существующих ошибок.
Во первых это поможет избежать двойных проверок.
Во вторых, если это делать через try catch, то там нету возможности передать тот же код ошибки.
28 авг 09, 13:35    [7590625]     Ответить | Цитировать Сообщить модератору
 Re: подмена сообщения об ошибке Cannot insert duplicate key и других  [new]
DVN
Member

Откуда: Minsk, Belarus
Сообщений: 184
-- Можно так
BEGIN TRY
  BEGIN TRANSACTION
  
  ...
  
  INSERT INTO Products (..., ..., ...)
  VALUES (..., ..., ...)
  
  ...
  
  DELETE Products
  WHERE ...

  ...
  
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION

  DECLARE @ErrMessage nvarchar(4000), @ErrSeverity int, @ErrState int
  SELECT @ErrMessage = CASE
                         WHEN CHARINDEX('Cannot insert duplicate key in object', ERROR_MESSAGE()) <> 0 THEN 'My error: Ошибка вставки кода продукции. такой продукт существует.'
                         WHEN CHARINDEX('The DELETE statement conflicted with the REFERENCE constraint', ERROR_MESSAGE()) <> 0 THEN 'My error: Ошибка удаления кода продукции. такой продукт нельзя удалить, он уже оприходован.'
                         WHEN CHARINDEX('Любое сообщение', ERROR_MESSAGE()) <> 0 THEN 'My error: Еше один мой месаг.'
                         ELSE ERROR_MESSAGE()
                       END,
         @ErrSeverity = ERROR_SEVERITY(),
         @ErrState = CASE WHEN ERROR_STATE() = 0 THEN 1 ELSE ERROR_STATE() END
  RAISERROR (@ErrMessage, @ErrSeverity, @ErrState)
END CATCH

GO

-- Или так

BEGIN TRY
  BEGIN TRANSACTION

  ...
  
  INSERT INTO Products (..., ..., ...)
  VALUES (..., ..., ...)
  
  ...
  
  DELETE Products
  WHERE ...

  ...
  
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION

  DECLARE @ErrMessage nvarchar(4000), @ErrSeverity int, @ErrState int
  SELECT @ErrMessage = CASE
                         WHEN ERROR_NUMBER() = 2627 THEN 'My error: Ошибка вставки кода продукции. такой продукт существует.'
                         WHEN ERROR_NUMBER() = 547 THEN 'My error: Ошибка удаления кода продукции. такой продукт нельзя удалить, он уже оприходован.'
                         WHEN ERROR_NUMBER() = ... THEN 'My error: ...'
                         WHEN ERROR_NUMBER() = 49999 THEN 'My error: Еше один мой месаг.'
                         ELSE ERROR_MESSAGE()
                       END,
         @ErrSeverity = ERROR_SEVERITY(),
         @ErrState = CASE WHEN ERROR_STATE() = 0 THEN 1 ELSE ERROR_STATE() END
  RAISERROR (@ErrMessage, @ErrSeverity, @ErrState)
END CATCH

-- ERROR_NUMBER() возвращает номер ошибки (поле message_id представления sys.messages)
-- select * from sys.messages
28 авг 09, 21:05    [7592870]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить