Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заменить ошибки сервера (ошибки модификации данных) на свои собственные? / 17 сообщений из 17, страница 1 из 1
22.08.2001, 07:12
    #32012480
ivans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
Всем привет! Прошу прощения, если я повторяюсь. Вроде как, моя проблема достаточно
распространенная. Но я обыскал весь форму и ничего не нашел. Плохо искал наверно =)

Ситуация простая:
Нужно заменить сообщение сервера типа:
DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_ContactPersons_Clients'. The conflict occurred in database 'DIZ', table 'ContactPersons', column 'ClientID'.
на понятное пользователю: Удаление записи из таблицы "Клиенты" невозможно, так как
есть связанные записи в таблице "Контактные лица".

Попробовал написать триггер следующего содержания (вернее создал триггер с помощью ErWin):
CREATE trigger tD_Clients on Clients for DELETE as
begin
declare @errno int,
@errmsg varchar(255)

if exists (
select * from deleted,ContactPersons
where
ContactPersons.ClientID = deleted.ClientID
)
begin
select @errno = 30001,
@errmsg = 'Невозможно удалить <Заказчика>, так как существуют связанные записи о <Контактных лицах>.'
goto error
end

return
error:
raiserror @errno @errmsg
rollback transaction
end

Однако, при попытке удалить запись возникает старое серверное сообщение.
Хотелось бы получить ответ на следующие вопросы:
1. Какие есть другие (нетриггерные) варианты решения этой проблемы?
2. Почему не работает мой триггер?
...
Рейтинг: 0 / 0
22.08.2001, 07:19
    #32012481
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
>Плохо искал наверно
Умгу, было уже не раз
Можно поменять сообщения в Sysmessage (если ничего не путаю)

>2. Почему не работает мой триггер?
Дык ить, DRI наверное не отключил, вот до триггера дело и не доходит
В MS SQL Ссылочная целостность может поддерживатья либо триггерами, либо DRI, а одновременно низя.
...
Рейтинг: 0 / 0
22.08.2001, 07:28
    #32012484
AnKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
А я вот попробовал

update master.dbo.sysmessages
SET description='1 '+description
where error=1

И получил ругательство:
Server: Msg 259, Level 16, State 2, Line 1
Ad hoc updates to system catalogs are not enabled. The system administrator must reconfigure SQL Server to allow this.

ЗЫ. А вообще мне название темы понравилось .
...
Рейтинг: 0 / 0
22.08.2001, 07:42
    #32012486
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
>А вообще мне название темы понравилось
А я как то сразу не обратил внимания, а сейчас проникся
...
Рейтинг: 0 / 0
22.08.2001, 08:02
    #32012488
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
2 Genady:
>Дык ить, DRI наверное не отключил, вот до триггера дело и не доходит В MS SQL Ссылочная целостность может поддерживатья либо триггерами, либо DRI, а одновременно низя.

Ну это Вы совсем зря. Триггеры Instead отрабатывают до DRI.
...
Рейтинг: 0 / 0
22.08.2001, 08:07
    #32012490
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
2 AnKa
надо в конфигурации разрешить изменение системных таблиц
...
Рейтинг: 0 / 0
22.08.2001, 08:09
    #32012491
ivans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
Грёбаный форум. Сообщение пофигачил. Заново набирать усё приходится.

1. Вариант с триггером.
В BOL написано, что сначала запускается проверка Referential Integrity, и если выходит
ошибка, то триггер и не запускается. Тут всё ясно.
Отключить RI - это 1) убрать все связи? или 2) есть специальная опция?
Если 1), то чем в остальных отношениях чревата замена связей на триггеры?

2. Вариант с заменой системных сообщений.
Не подходит:
1) Переустановка сервера требует пере-изменения этих сообщений.
2) В любом случае в этих системных сообщениях выдаются СИСТЕМНЫЕ имена таблиц, а юзеру
надо видеть нормальные русские названия инфо-объектов (Заказчик, Договор).

Просьба дать ссылки на обсуждения данной проблемы.

P. S. Кстати чё вы так прётесь над сабжем? Не надо понимать всё так буквально =)
...
Рейтинг: 0 / 0
22.08.2001, 08:11
    #32012493
ivans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
2 Павел:
Забыл упомянуть. У нас MS SQL 7.0, там, насколько я знаю, таких примочек нет.
...
Рейтинг: 0 / 0
22.08.2001, 08:19
    #32012494
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
2 ivans
Может лучше не городить огород, а прописать сообщения об ошибках в бизнес объектах?
>Отключить RI - это 1) убрать все связи? или 2) есть специальная опция?
Ну да, убрать все связи, а целостность поддерживать триггерами.

>Кстати чё вы так прётесь над сабжем? Не надо понимать всё так буквально
Да ладно, не обижайтесь
просто прикольно получилось, из серии "нарочно не придумаешь"
...
Рейтинг: 0 / 0
22.08.2001, 08:21
    #32012495
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
2 Павел
Ну забыл указать что это для версий до семерки включительно. Но народ и так все понял.
...
Рейтинг: 0 / 0
22.08.2001, 09:11
    #32012503
ivans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
2 Genady:
В бизнес-объектах? Имеется в виду на клиенте?

И всё-таки, где эта проблема уже обсуждалась?
...
Рейтинг: 0 / 0
22.08.2001, 10:17
    #32012509
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
>В бизнес-объектах? Имеется в виду на клиенте?
Ну не обязательно на клиенте, зависит от того какая у Вашего приложения архитектура. Я во всяком случае имел в виду сервер приложений, т.е. как минимум 3-х уровневую.
...
Рейтинг: 0 / 0
22.08.2001, 12:35
    #32012539
ivans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
У меня 2-х уровневая структура.
Но каким образом вы сможете прописать сообщение об ошибке, которая генерится на
сервере, на клиенте. Это значит что на клиент нужно так же перенести все проверки
на целостность данных, которые делает сервер.

Допустим идёт удаление из таблицы "клиенты", которая связана с таблицами "договора",
"контактные лица", "оплаты" и т. д.
Вы же не будет на клиенте прописывать проверку для кажой из таблиц, на возможность удаления. Это не рационально.
Как в данном случае определить с какой из таблиц произошло нарушение ссылки?
Сервер возвращает запись типа, как я уже писал в начале:
DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_ContactPersons_Clients'. The conflict occurred in database 'DIZ', table 'ContactPersons', column 'ClientID'

Получается, только триггерный вариант пока самый верный.
...
Рейтинг: 0 / 0
22.08.2001, 12:47
    #32012543
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
>У меня 2-х уровневая структура.
В этом случае тяжелей конечно. Если Ваш проект только начинается переходите на n-уровневую не пожалеете

>Сервер возвращает запись типа, как я уже писал в начале:
DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_ContactPersons_Clients'. The conflict occurred in database 'DIZ', table 'ContactPersons', column 'ClientID'

Ну дык, а объект Error в ADO просто так что ли присутствует?
Думаю обработать пришедшую с сервера ошибку не так уж сложно.
...
Рейтинг: 0 / 0
22.08.2001, 14:46
    #32012557
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
Если не лень, то дополните в соседнем форуме по аналогичной проблеме:
http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=access&Post=12
...
Рейтинг: 0 / 0
22.08.2001, 19:13
    #32012567
V. Motchulsky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
Я бы использовал сохраненную процедуру для удаления клиента. Ее легче модернизировать чем клиентско ПО и с тригерами путаться не надо.
...
Рейтинг: 0 / 0
22.08.2001, 21:28
    #32012571
Deosfen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить ошибки сервера (ошибки модификации данных) на свои собственные?
У меня было точно такая проблема, пришлось удалить RI, и целостность реализовывать триггерами, и там писать понятные сообщения для клиента.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заменить ошибки сервера (ошибки модификации данных) на свои собственные? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]