Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
Задача вроде простая, но все варианты, которые удалось найти не прошли по синтаксису. Существует таблица с триггером на UPDATE. Триггер пишет записи в другую таблицу (одно из полей имеет индекс уникальности) на основе данных таблицы-источника. При попытке триггера отработать вставку записи с нарушением уникальности возвращается ошибка и UPDATE не проходит. Как в триггере применить обработку такой ошибки и просто ничего не делать в случае появления ошибки? т.е. Запись в новую таблицу не вставлять, но в источнике UPDATE должен пройти. На данный момент временно используется проверка на существование записи через WHEN триггера. Но такой вариант не красивый да и наверное грузит систему сильнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 11:03 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
Если что-то неудобно делать в теле триггера, это можно оформить как хранимую процедуру, и вызывать из триггера. А синтаксис SQL PL внутри хранимой процедуры куда богаче, чем в теле триггера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 11:26 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
Об этом тоже думал, но посчитал, что все намного проще и можно прям в триггере делать. Просто во многих печатных изданиях пишут, что триггер - это та же ХП, которая вызывается автоматически по событию (INSERT, UPDATE, DELETE). Вот и подумал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 11:37 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
omentosСуществует таблица с триггером на UPDATE. Триггер пишет записи в другую таблицу (одно из полей имеет индекс уникальности) на основе данных таблицы-источника. При попытке триггера отработать вставку записи с нарушением уникальности возвращается ошибка и UPDATE не проходит. Как в триггере применить обработку такой ошибки и просто ничего не делать в случае появления ошибки? т.е. Запись в новую таблицу не вставлять, но в источнике UPDATE должен пройти. На данный момент временно используется проверка на существование записи через WHEN триггера. Но такой вариант не красивый да и наверное грузит систему сильнее.У вас настолько сложный insert в новую таблицу, что невозможно написать его так, чтобы он просто не вставлял дублирующую запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 11:43 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinУ вас настолько сложный insert в новую таблицу, что невозможно написать его так, чтобы он просто не вставлял дублирующую запись? Нет, не сложный. Я сейчас пока так примерно и сделал. В WHEN запихал проверку на наличие записи. Если нет, то триггер с ИНСЕРТОМ отработает, а если есть, то не отработает. Создал нужные индексы и все вроде работает нормально и достаточно быстро. Просто это выглядит совсем не профессионально. Я такой человек, что люблю совершенствоваться и если мне кажется, что может быть лучше и быстрее работать, то я стараюсь научиться этому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 12:19 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinУ вас настолько сложный insert в новую таблицу, что невозможно написать его так, чтобы он просто не вставлял дублирующую запись? Я вот над Вашими словами поразмыслил. Вы имеете ввиду исользовать MERGE? Или типа того? Я просто ничего другого не знаю чтоб прям в INSERT прописать "не вставлял дублирующую запись" Подскажите тогда плз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 12:27 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
omentosЯ сейчас пока так примерно и сделал. В WHEN запихал проверку на наличие записи. Если нет, то триггер с ИНСЕРТОМ отработает, а если есть, то не отработает.Триггер с инсертом? Зачем он? Что он делает? Не могли бы вы схематично привести свой пример? Я думал, что у вас примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. Или я неправильно понял задачу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 12:35 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
omentosОб этом тоже думал, но посчитал, что все намного проще и можно прям в триггере делать. Просто во многих печатных изданиях пишут, что триггер - это та же ХП, которая вызывается автоматически по событию (INSERT, UPDATE, DELETE). Вот и подумал. Тем не менее, в случае DB2 внутри тела триггера синтаксис урезан по сравнению с SP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 13:20 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinТак что, нельзя написать этот инсерт так, чтоб он не вставлял дубли в log? Или я неправильно понял задачу? Если это действительно лог, то там того unique constraint'а вообще быть не должно (только какой-нибудь суррогатный ключ и не более того). Значит, это не лог. Хотя, если это не лог, то что же это? merge, конечно, тоже выход из положения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 13:26 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
Нет, это не лог, это таблица, куда при определенных условиях попадает часть данных. Вы конечно спросите почему этим не занимается прога, которая пишет данные в первую таблицу. Действительно так было бы легче. Просто так сложилось, что программу доработать нельзя, а можно использовать только плод ее работы - таблицу-источник. Вот и было принято решение по быстрому сlделать небольшой триггер, но вся загвоздка в том, что в таблице источника одна и та же запись может обновляться несколько раз, но записать в таблицу-получатель нужно только один первый раз. В итоге вышел такой триггер: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 14:56 |
|
||
|
Обработка ошибок в триггере
|
|||
|---|---|---|---|
|
#18+
Примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2008, 16:19 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35551852&tid=1603681]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 221ms |
| total: | 394ms |

| 0 / 0 |
