Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 обработка ошибки добавления дубликата  [new]
now
Guest
SQL SERVER 2000
В таблице есть уникальный индекс, как в ХП сделать показ сообщения "Вы ввели дубликат!", когда пользователь добавляет идентичную запись?
3 окт 12, 11:09    [13260186]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
if exists (
   select 1
   from table t1
      inner join table t2 on t1.UniqField = t2.UniqField
     ) 
begin
    raiserror (N'Вы ввели дубликат!', 16,10) with seterror
end


как то так , т.е. самостоятельно до втсавки апдейта проверить
3 окт 12, 11:12    [13260223]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
В XP или на клиенте обработать ошибку?
Просто это клиентская часть и должно быть обработано на клиенте.
Клиент может обработать ошибку по её коду и содержимому.

Maxx, не учите плохому.
3 окт 12, 11:14    [13260248]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Mnior,

Что значит плохому,клиент клиентом -но самому написать код проверки вовсе не лишнее,тем более клиент не слова не занет об индексах на таблице,ИМХО
Поняятное дело,что если SP нрохнулась - то на клиенте надо отловить сообщение об ошибке и вернуть его юзверю..но помоему ТС спрашивал совершенно не ето .
3 окт 12, 11:18    [13260287]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
now
Guest
как мне сравнить запись, ктр юзер хочет вставить, с тем что уже есть в бд?
а потом ченить в этом роде
raiserror 13001 'Ошибка: тра-ля-ля'
rollback transaction
3 окт 12, 11:21    [13260315]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
now,

а как вы вставляете в таблицу ?
3 окт 12, 11:22    [13260324]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
now
Guest
Maxx
now,

а как вы вставляете в таблицу ?


SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO
CREATE PROCEDURE dbo.ADD_DOCS
@NAME varchar(100), 
@ID_NOTE INT 

AS

INSERT INTO DOCS(ID_NOTE,NAME)
VALUES (@ID_NOTE,@NAME) 

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
3 окт 12, 11:24    [13260331]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Для 2005-го я делал обработку, как на клиенте, так и на сервере (12108252).
Если посмотреть код, то видно что обрабатываются ошибки 547, 2601 и 2627
Только я в добавок ещё выуживаю в каких объектах были допущены - универсальная функция для многоразового удобного использования.
Но у каждого клиента свой интерфейс, так что затачивайте на него. У меня есть для C#.

CREATE TABLE #Table (ID Int CONSTRAINT [PK_Table] PRIMARY KEY)
INSERT #Table SELECT 1 UNION ALL SELECT 1
PRINT @@Error
DROP TABLE #Table

/*
Msg 2627, Level 14, State 1, Line 2
Нарушено "PK_Table" ограничения PRIMARY KEY. Не удается вставить повторяющийся ключ в объект "dbo.#Table". Повторяющееся значение ключа: (1).
2627 -- PRINT
*/
3 окт 12, 11:25    [13260344]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну и чем вам мой первый ответ не подходит ?
select 1
from DOCS
where ID_NOTE  =@ID_NOTE
   and NAME = @NAME
3 окт 12, 11:26    [13260354]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Mnior, ну и славно с вами никто и не спорит... с 2005 вообще можно в трай кетч все заврнуть и мало того,что отправить ошибку на клиента,можно еще спокойно вести логирование собственое
3 окт 12, 11:29    [13260383]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Maxx
но самому написать код проверки вовсе не лишнее
Это можно для, для всяких говно поделках.
Лишняя гарантированная нагрузка никому не нужна. А обработка ошибок всегда есть и делается не часто.
Maxx
тем более клиент не слова не занет об индексах на таблице,ИМХО
Клиент знает что связывается с сервером. У него настроен конкретный провайдер и API вызовов. Он знает с чем связывается.
Процедуру может вызывать и не клиент, а другая процедура, излишняя обработка + никому не нужная ошибка.

И последнее, клиентская система может по разному обрабатывать. Нормальная система не будет орать на клиента всяким текстом, "оставляя его одного с проблемой", а сразу обработает за него все автоматические действия. Причин дублирования могут быть разные по смыслу.
3 окт 12, 11:33    [13260429]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
now
Guest
Maxx,
CREATE PROCEDURE dbo.ADD_DOCS
@NAME varchar(100), --НАЗВАНИЕ ФАЙЛА
@ID_NOTE INT --НОМЕР СЗ

AS

INSERT INTO DOCS(ID_NOTE,NAME)
VALUES (@ID_NOTE,@NAME) 


if exists (
   select 1
   from docs
      where name = @name
     ) 
begin
  raiserror (N'Вы ввели дубликат!', 16,10) with seterror
end

на клиенте появляется сообщение :
Картинка с другого сайта.
3 окт 12, 11:35    [13260442]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
now,
+

CREATE PROCEDURE dbo.ADD_DOCS
@NAME varchar(100), --НАЗВАНИЕ ФАЙЛА
@ID_NOTE INT --НОМЕР СЗ

AS
if exists (
   select 1
   from docs
      where name = @name
     ) 
begin
  raiserror (N'Вы ввели дубликат!', 16,10) with seterror
end

INSERT INTO DOCS(ID_NOTE,NAME)
VALUES (@ID_NOTE,@NAME) 

3 окт 12, 11:39    [13260472]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Читатель неместный
Guest
а ну или так
create unique index [Вы ввели дубликат в таблицу ..!" ] on таблица ( поля)
3 окт 12, 11:40    [13260480]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Mnior
Это можно для, для всяких говно поделках.
Лишняя гарантированная нагрузка никому не нужна. А обработка ошибок всегда есть и делается не часто.


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

Mnior
И последнее, клиентская система может по разному обрабатывать. Нормальная система не будет орать на клиента всяким текстом, "оставляя его одного с проблемой", а сразу обработает за него все автоматические действия. Причин дублирования могут быть разные по смыслу.

сорри - но сие вообще не имеет отношения к теме топика ,а если юзверь ввел мусор -то надо ему об етом сообщить,а не говородить исскуственый интелект,он как раз и будет лишней логикой по факту. Есно есть ситуации когда надо чет выдумывать ,конформить и етц.... но никакого отношения ето не имеет к возарту ошибки на клиенту если она есть
3 окт 12, 11:41    [13260486]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Panshin
Member

Откуда:
Сообщений: 106
может просто не давать вставлять дубли. Какой смысл в переговорах между клиентом и сервером?

insert into dst(...)
select ...
from src s
left join dst d on d.key=s.key
where d.key is null
3 окт 12, 12:13    [13260775]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Maxx
Mnior, ну и славно с вами никто и не спорит... с 2005 вообще можно в трай кетч все заврнуть и мало того,что отправить ошибку на клиента,можно еще спокойно вести логирование собственое
Опять. же на клинте.
Не нужно смешивать код.
Код должен содержать только бизнес логику, и это бизнес логика далеко не каждую ошибку обрабатывает.
Логирование, обработки и другая дребедень лежит совершенно в другом коде и плоскости.
Прозрачный прокси класс соединения с сервером скрыто делает всю необходимую рутину. Тем более что есть много способов логирования, и слава богу с 2005 их стало очень много, совершенно не трогая бизнес код.

at 11.40
3 окт 12, 14:56    [13262281]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Mnior,

Я понял вашу точку зрения , не вапрос - но от дисскусии воздержусь в виду нехватки времени, когда будет посвободнее с удовольствием готов разлится мыслию по древу на сию тему, но,увы не сейчас.
3 окт 12, 15:01    [13262315]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Maxx
читаемое сообщение об ошибке - гораздо лутше примари кей виолейшн
тулзы которые выдают на клиента системные ошибки - вместо нормально понятных пользователю - иесть как раз говноподелками
Вы это о чём? Да 2 + 2 = 4
Maxx
а если юзверь ввел мусор -то надо ему об етом сообщить,а не говородить исскуственый интелект
Слушайте. Давайте без передирания.
Я говорю об интерфейсе пользователя. У этого своя профессия - юзабилист. Нам до них как до ... раком. Если ани послушают наш этот бред то, то со смеху помрут. Поэтому тут работает только модульный подход.
Ничего не перехватываешь, а передаёшь наврх. Там ГУЙщик пусть и решает как то или иное обрабатывать и как вызывать, ну и т.п.
Если портить карты своими поделками и костылями, то это только систему разваливать.

Panshin
Какой смысл в переговорах между клиентом и сервером?
1. Каких нахрен переговоров. Тупо ничего не делашь, ни одной стороки кода. Пусть клиент полученную ошибку тупо обработает. Все необходимые данные уже есть.
2. Вы знаете как работает парадигма Ecxception? Какой у try/catch подход и интерфейс взаимодействия? Вы знаете какие типы стратегий try/catch бывают? В чём преимущества той или иной стратегии/подхода?

При постоянной проверке, получается что нужно увеличить нагрузку в среднем в 2 раза (на каждом этапе). При проверке только в исключительных случаях, можно выбрать другие методы. Допустим, если дубль будет делаться в каждом 10м случае, то у вас 10ти кратный запас по эффективности, если при каждом 100м, то 100 кратный запас. И можете в этот запас прописать всё что угодно, с блек-джеком и ...
И это всё не говоря о нарушении понятия модульности.
3 окт 12, 15:26    [13262490]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Mnior,

от уж вы любитель спорить и доказывать свою точку зрения.
нашинковали тут капусты
3 окт 12, 15:39    [13262602]     Ответить | Цитировать Сообщить модератору
 Re: обработка ошибки добавления дубликата  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Maxx,
В семье не без у...а.
Да я помешан на этом и меня всё время заносит.
Кто-то должен это делать бла-бла-бла генетика бла-бла-бла эволюция бла-бла-бла стратегии бла-бла-бла. Ну вот опять.
3 окт 12, 16:23    [13262898]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить