Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
Добрый день, уважаемые знатоки! В триггере вставляю данные и проверяю на уникальность (коряво, но по другому при текущей архитектуре никак): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Можно ли как то перехватить ошибку и выдать уже нормальное предупреждение: что типа: Нарушение уникальности при вставку в таблицу: DOCUMENT.DOC_ARGUMENTT Я подобную задачу помню пытался сделать на MSSQL-2008, не получилось- типо слишком низкоуровневая ошибка! Осилит ли такое DB2? (Windows, DB2-9.7). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2014, 17:00 |
|
||
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
medoed, Можно, если использовать не Inlined, а Compiled compound SQL. Для триггеров, процедур и функций это определяется использованием BEGIN ... END вместо BEGIN ATOMIC ... END. В Compiled коде можно использовать хэндлеры для перехвата событий. Но надо при этом помнить, что такой триггер (возможность использовать compiled триггеры появилась возможность в 9-ке (9.7?)) будет работать совершенно по-другому и в значительной части ситуаций существенно медленнее. Связано это с тем, что вместо просто выполнения общего плана запроса (с интегрированным туда кодом триггера) будут делаться реальные вызовы в Procedure Virtual Machine (PVM) для исполнения кода триггера. Для приведённого триггера без превращения его в Compiled можно было бы использовать IF с предварительной проверкой селектом и вызовом ф-и RAISE_ERROR(...) или используя statement SIGNAL . А ещё лучше - просто statement MERGE с интегрированным SIGNAL на WHEN MATCHED (см. последний пример). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2014, 18:00 |
|
||
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
CawaSPbmedoed, Для приведённого триггера без превращения его в Compiled можно было бы использовать IF с предварительной проверкой селектом и вызовом ф-и RAISE_ERROR(...) или используя statement SIGNAL . А ещё лучше - просто statement MERGE с интегрированным SIGNAL на WHEN MATCHED (см. последний пример). Нет, это невозможно (предварительный select)! Вы не предусмотрели одновременную вставку, в триггере нельзя сделать select с with ur. Поэтому проверку перед вставкой не реализовать (есть две одинаковы незакоммиченные записи)! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2014, 18:33 |
|
||
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
medoed, Ну, не то, чтобы уж совсем не подходит. Встаёт вопрос сериализации доступа к изменению данных таблицы, который можно реализовать различными способами, не только чтением в режиме RR . Но, действительно, вариант не к месту. MERGE в данном случае - как раз тот инструмент, который идеально подходит к задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2014, 20:02 |
|
||
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
CawaSPbmedoed, Ну, не то, чтобы уж совсем не подходит. Встаёт вопрос сериализации доступа к изменению данных таблицы, который можно реализовать различными способами, не только чтением в режиме RR . Но, действительно, вариант не к месту. MERGE в данном случае - как раз тот инструмент, который идеально подходит к задаче. Вы сами верите, в то что написали? Чем мне поможет merge при одновременной вставке да еще и в триггере!? Я так понял все же первоначальный ответ на мой вопрос - отрицателен! И даже Марк Баринштейн мне не в силах помочь, я прав Марк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2014, 10:19 |
|
||
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
medoedВы сами верите, в то что написали? Чем мне поможет merge при одновременной вставке да еще и в триггере!? Я думаю вы правы, без повышения уровня изоляции MERGE в этом случае не поможет, поскольку MERGE - операция не атомарная и в промежутке между OUTER JOIN'ом и UPSERT'ом данные в целевой таблице могут измениться, так что при попытке добавить запись с уже существующим уникальным ключом UPSERT может закончится все той же SQL0803N, которую вы и пытается отловить. medoedЯ так понял все же первоначальный ответ на мой вопрос - отрицателен! Ну, не совсем :) Вам уже пояснили, что вместо инлайн триггера вы можете использовать компилируемый, который поддерживает объявление обработчиков исключений, если только по каким-то причинам компилируемые триггеры вам не подходят (например, скорость выполенния триггера является критическим фактором в работе вашего приложения). Например так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. Кстати, не занудства ради, а во имя математичекой точности, небольшое уточнение по поводу PVM: CawaSPb ...реальные вызовы в Procedure Virtual Machine (PVM) для исполнения кода триггера. PVM - это акроним от PSM Virtual Machine, а что такое PSM - все итак прекрасно знают :) А переключение контекста между классическим DB2 рантаймом и PVM происходит, да, что привносит дополнительные накладные расходы и существенно влияет на производительность выполнения запросов, как уже справедливо заметил уважаемый CawaSPb. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2014, 17:58 |
|
||
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
>>anton.k Спасибо за грамотный ответ. Код триггера попробую использовать! Мне просто непонятно было, почему CawaSpb такие нелепые советы давал по контролю в триггере задвоений предварительным селектом?! Как к админу к нему претензий нет, но советы по предварительным селектов и merge в триггере - ни о чем! Перед Антоном снимаю шляпу! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2014, 10:14 |
|
||
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
medoed, почему бы не использовать конструкцию типа: (может я не понимаю что в итоге надо ?) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. p.s. это делалось на 9.7.5 при включенной совместимости с ora ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2014, 17:53 |
|
||
|
Сгенерить низкоуровневую ошибку на базе программно возможно?!
|
|||
|---|---|---|---|
|
#18+
может_такmedoed, почему бы не использовать конструкцию типа: (может я не понимаю что в итоге надо ?) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. p.s. это делалось на 9.7.5 при включенной совместимости с ora Ну мне в триггере хотелось просто проверять. А писать процедуру для проверки возможно наверное, но громоздо это и не уверен что уровень изоляции там не проигнорится. Мне ответ Антона по душе, возможно завтра попробую... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2014, 18:48 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=38783707&tid=1600964]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
72ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 177ms |

| 0 / 0 |
