![]() |
|
Модераторы: Akina |
![]()
|
|
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Я накладываю на таблицу Constraint, no хочу чтобы в случае если пользователь вводит в таблицу что-то что противоречит назначенному Constraint вместо стандартной аббракадабры типа
определить осмысленное сообщение об ошибке и чтобы именно это сообщение выдавалось клиенту. На уровне приложения делать обработку ошибок крайне не желательно, так как количество приложений, работающих с базой данных исчисляется сотнями, т.е. для переделки всех их потребуется минимум месяц работы, с другой стороны абсолютно неквалифицированный пользователь должен получить вполне удобочитаемое и понятное сообщение типа: "введение значения номера месяца больше 12 недопустимо" -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Импоссибль - это сообщение выдает не сервер, а ODBC-драйвер на клиенте.
Пишите более внятные маны... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Не уверен, по-моему, я где то видел что можно указать драйверу проверять constraint самому или поручить это серверу...
В том то и дело, как я говорил - таблицу использует несколько сот совершенно разных приложений, манов соответственно тоже сотни... Не то чтоб это было невозможно заменить всё, просто очень трудоёмко -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
ОДИН ман "Возможные сообщения об ошибках, их причины и методы их устрания". -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Хех... не получится... Ну не можешь ты давать один ман для сотрудников моей корпорации которые работают с таблицей и его же для нескольких клиентов... Клиенты не должны видеть ошибки которые могут возникнуть только внутри корпорации, мало того так как таблицы толкьо частью пересекаются то клиенты не должны видеть ошибки которые могут возникнуть только для другого клиента. Это не допустимо: пример, ты представитель копорации Ford и в своём мануал наталкиваешься на возможную ошибку: Table GeneralMotors_Portal does not match Chrysler_Production invoice_number Представитель компании Ford вообще не должен знать о том что его прямые конкуренты General Motors и Chrysler тоже являются клиентами нашей корпорации, тем более что между General Motors и Chrysler есть какие-то сношения! Некоторые сообщения об ошибках которые возможны только во внутренней сети компании или при прямом обращении к базам данных из компании могут серьёзно повредить репутации фирмы или снизить степень защиты данных. Конечный пользователь должен иметь список только тех ошибок которые его касаются. Все остальные должны быть идентифицированные просто как "Internal Error" с каким-то номером... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
чем after тригер плох?
|
|||
|
||||
| Akina |
|
||||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Эк тебя заносит... пусть себе там General Motors и Chrysler сношаются... я тебе о чем? юзер видит:
лезет в ""Возможные сообщения об ошибках, их причины и методы их устрания" и там читает: Если на экране появилось окно с надписью:
Ему надо объяснять, что привело к этому ТИПУ ошибки, и что он должен проверить прежде чем попытаться получить такое же сообщение еще раз. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||
|
|||||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 5 Всего: 22 |
Vit
Делаешь триггер с заменой неверного значения на верное (по умолчанию). В инструкции пишешь: "Если введенное значение заменяется на другое, значит введено было неверное. Подумайте и повторите ввод." Все. |
|||
|
||||
| Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Не совсем так. Constraint могут ставится на достаточно сложные логические ошибки. Типа: "для компании "Ford" интервал сканирования данных согластно контракту не может быть более 5 минут" При этом для компании Крайслер такого ограничения нет даже теоретически. В зависимости от клиента логика ограничений может сильно варьировать. Невозможно указать осмысленное сообщение об ошибке без привязки к конкретному клиенту, а следовательно если делать справочник по всем кодам, то надо делать для каждого клиента отдельный. Кроме того - это живые данные клиентов: Завтра клиент звонит и требует чтоб добавили какое-то ограничение, а это будет означать не только в базе подправить, а подготовить новый ман и его всем разослать, эдак у меня на подготовку манов больше времени уйдёт...
1. Заменять ничего нельзя! Ты что! За переправленной цифрой могут стоять семизначные суммы денег! Кто-то введёт что-то не то, на то что цифра изменила значение не посмотрит, локальный клиент запишет в лог что было введено то-то... В конеце месяца обнаружится что расходы корпорации-клиента составили вместо 10000 долларов - 1000000... От того что они в результате очень долгих поисков обнаружат этот триггер и по чьему заказу он был сделан легче не станет, корпорация уже потеряет большие деньги... 2. Триггер не хочу - он отрабатывает не до запроса а после запроса, на очень больших и загруженных таблицах как у меня десяток триггеров вполне способны угробить сервак, точнее снизить его производительность ниже требуемой, он и так задыхается... какие там ещё триггеры! -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 162 |
Может поможет http://www.relib.com/forums/thread754956.aspx
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| SergKO |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 14.3.2005 Репутация: 17 Всего: 20 |
В самом деле, посмотрите в сторону RAISERROR. Таблицу sysmessage можно пополнять, пользовательские сообщения с номером не ниже 50 000.
|
|||
|
||||
| SergeBS |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 5 Всего: 22 |
Vit
1. Ты знаешь, какое должно быть верное значение (хотя бы диапазон). Делаешь проверку и если значение неверное - исправляешь на верное. Все корректно. При желании вместо строчки в инструкции (или вместе с) добавь Сообщение (красного цвета, в полэкрана и : 2. Ты НЕ знаешь, какое должно быть верное значение. Тогда ты не можешь и проверить. Может быть либо 1, либо 2. Крики про деньги - самоообман. Если Мэри листая Плейбой долбила по 0 и вместо 1$ - ввела 1,000,000,000,000,000$, то ты эту ошибку никак не отловишь и виновата все-таки Мэри. У нее отберут любимый журнал и разницу вычтут из жалованья (в рассрочку на 100 лет).
вариантов опять 2: 1. Отрабатывает сервер. Чтобы ты ни придумывал, нагрузка на него, есс-но возрастет. Должен быть запрос. Или ХП. Или триггер на append/update/delete. Или ограничение. Что грузит больше, угадай. Ограничение - ну оно если и меньше грузит, то ненамного. По идеологии РБД - должен быть триггер. Сложное правило. Сложность в том, чтобы видно было отработку всем, но не видно - почему. 2. Отрабатывает клиент. У тебя их разных 100 типов. Все переделать. Может быть либо 1, либо 2. Есть 3 вариант, еще страшнее: 3-х звенка. В просторечии MIDAS. |
||||
|
|||||
| Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Это корпоративный бизнес, там свои правила. Я не могу вставлять значение, никакое. Должна генерироваться ошибка и транзакция проходить не должна, пока пользователь не введёт значение которое разрешено по условиям контрактов.
Триггер ГОРАЗДО более напряжный с точки зрения рассходов ресурсов так как отрабатывается после транзакции. Если я ставлю constraint то сервер сначала проверяет запрос на constraint а только потом его выполняет, если поставить триггер, то реально произойдёт - изменение таблицы, изменение всех зависимых таблиц, перестройка индексов и кластерного индекса, увеличение аутоинкрементов в таблице и всех связанных, затем отработка запроса триггера и откат транзакции. В течение всего этого времени все вовлечённые таблицы будут полностью или частично заблокированны на запись, а иногда и на чтение (в зависимости как hints установлены), кроме того для отработки такой транзакции сам сервер будет ждать пока все вовлечённое дело таблицы будут доступны на редактирование. Итого расходы на триггер просто несопоставимы с constraint - речь идёт о накладных расходах отличающихся на порядки! База данных и так очень загружена, лишний триггер вполне может очень сильно тормознуть систему, особенно при учёте что вовлечены таблицы размером с пол-террабайта при количестве одновременных подключений далеко за тысячу и нагрузкой от 10 до 100 запросов в секунду... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
| SergeBS |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 5 Всего: 22 |
Vit
"С этого и надо было начинать" Штирлиц. С такими аппетитами без 3-хзвенки не выживешь. Все остальное - паллиатив. И то наверняка кластеризовать придется. А как с сетевым трафиком дела? Сервак несколько портов в несколько подсеток имеет? Просто интересно. Я опасаюсь, что мне где-то через полгода-год тоже понадобится решать задачу подключения толпы, причем территориально разделенной. Все, блин, помешались на термине "единое социальное окно".
Какой бизнес - неважно. Вот вся цепочка: - в любом случае либо есть проверка, либо нет. - для любой проверки либо есть возможность получить правдоподобное значение, либо нет. - соответственно если есть возможность, то либо есть необходимость вставлять это правдоподобное, либо нет. Консенсус? У меня просто часто были задачки, когда одно поле - не больше другого по значению и как правило - равно, но только как правило. Я и привык это поле заполнять из другого, либо как только другое введено, либо после ошибки в нем самом. |
||||
|
|||||
| leniviy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
Vit
Что мешает в after триггер вставить Rollback? |
||||
|
|||||
![]()
|
| Правила форума "MS SQL" | |
|
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS SQL Server | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |