Сообщение при срабатывании констрейнта

Andrushk
Дата: 01.08.2005 16:51:57
Доброго времени суток!
Не подскажете, можно как-нибудь переопределить текст ошибки, возвращаемый при срабатывании констрейнта? Т.е., скажем я пытаюсь удалить запись, на которую ссылаются записи другой таблицы, возникает ошибка: "ORA-02292: integrity constraint (VNP.SYS_C002728) violated - child record found...." показывать ее пользователю бессмыслено, хочется вместо этого вывести что-то типа: "Имеется вышестоящий документ, удаление невозможно...". Можно как-то связать констрейнт и сообщение о его срабатывании?
alex-ls
Дата: 01.08.2005 17:00:55
Триггер можно написать...
А вообще это можно и на клиенте обработать или в процедуре удаления.
Vadim_Maximov
Дата: 01.08.2005 17:02:46
1. Сделать такую таблицу самостоятельно
2. При добавлении констрейна прописывать соответствие в таблице
3. На клиенте написать обработчик исключений, который бы лазил в таблицу и выдавал пользователю нормальное сообщение.
Реализуется элементарно.
Shtock
Дата: 01.08.2005 17:18:02
А можно сделать пакет, в котором объявлен массив и при инициализации ошибки туда загружаются. + - не дергается база. - - занимает память сервера.
softwarer
Дата: 01.08.2005 17:35:05
Shtock
А можно сделать пакет, в котором объявлен массив и при инициализации ошибки туда загружаются. + - не дергается база. - - занимает память сервера.

Хм. Есть слабая надежда, что ошибки в приложении не настолько часты, чтобы "дергание базы" оказалось страшнее траты оперативки на хранение этой таблицы.
Vadim_Maximov
Дата: 01.08.2005 17:37:16
softwarer
Shtock
А можно сделать пакет, в котором объявлен массив и при инициализации ошибки туда загружаются. + - не дергается база. - - занимает память сервера.

Хм. Есть слабая надежда, что ошибки в приложении не настолько часты, чтобы "дергание базы" оказалось страшнее траты оперативки на хранение этой таблицы.
Приложения разные бывают
Andrushk
Дата: 01.08.2005 17:42:23
Триггер понятно, так и сделано.
Есть куча своих минусов, плюс получается, одна проверка два раза делается...

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

Про пакет не понял...можно подробнее?

Вообще идея то какая. Раз есть констрейнт, значит я сам ничего проверять не должен. Раз Oracle при срабатывании констрейнта генерит сообщение об ошибке, значит надо как-то ему сказать, что для данного констрейнта надо вывести вот такой текст...Вопрос, можно это сделать? Да, забыл написать, версия Oracle 8.1.7...
softwarer
Дата: 01.08.2005 19:09:38
Vadim_Maximov
Приложения разные бывают

Бывают. Но даже для разных buffer cache + shared pool, полагаю, сработают эффективнее, нежели хранение достаточно большой таблицы отдельно для каждой из нескольких сотен-тысяч сессий :)
Shtock
Дата: 02.08.2005 09:06:01
У нас в приложении одновременно сидит не более 100 пользователей (правда коннектов может быть больше - около 250-300).Плюс к таблице ошибок в памяти у меня еще висят данные по системе контроля доступа. Пока ничего не жужит.
Bely
Дата: 02.08.2005 10:35:34
softwarer
Shtock
А можно сделать пакет, в котором объявлен массив и при инициализации ошибки туда загружаются. + - не дергается база. - - занимает память сервера.

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