Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
есть несколько SQL серверов разных версий 2012 и 2014 на них одинаковые базы созданные по одному и тому же скрипту. в каждой есть некая таблица log и хранимка типа Код: sql 1. 2. 3. 4. 5. 6. 7. при одной и той-же ситуации, когда в try возникает одна и та же (смоделировано) ошибка, в 2012 в таблице log ничего не появляется, в 2014 все нормально. где грабли? куда копать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 16:20 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
Раз смоделировали, давайте репро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 16:21 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
Shlgor, если у вас будет такой код выполняться в транзакции и вы словите exception в блоке try, у вас транзакция перейдет в нефиксируемое состояние и никакого insert в блоке catch разрешено не будет. Код: sql 1. 2. 3. 4. 5. 6. 7. проверьте, может дело именно в этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 17:04 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
felix_ff, тьфу забыл Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2019, 17:06 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей Алексеевич, был не прав :(, версии SQL все 2014 - 12.0.2269.0 кроме трех, один 2012, 2014 SP2 и 2016. убрал из рассматриваемых эти 3. на всех остальных все одинаковое, но результат разный. почему - никак не пойму. репро подготовлю выложу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 11:14 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
ShIgor, set xact_abort on откатит транзакцию и вы действительно поймаете исключение из-за uncommitable state. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 11:47 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, там все значительно сложнее.. действительно, если бы было так просто как в первом посте, то достаточно было бы в кэтч добавить проверку экзакт_стэйт <> 0 и откатить транзакцию. но получается, что это я думаю что ситуация одна и та же, а на самом деле видимо нет. соответственно, в зависимости от той ситуации, попаду я в кэтч или нет.. похоже я понял почему я не попадаю. repro Код: sql 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. почему проверку экзакт_стэйт на -1 я не могу поставить ни в usp_inner, ни в текстовую строку никакими способами, иначе получу в ut_log пусто в обоих случаях и почему ошибка в случае отката 208, а в случае вываливания 3930 странно все это.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 18:07 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
ShIgor, Код: sql 1. потому что вы таблицу удилили? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 18:17 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
Может быть в log запись не появляется потому, что процедура выполняется в транзакции, а транзакция откатывается из-за недопустимого состояния? Вы же в блоке catch исключение не выбрасываете. Если надо писать в журнал при любых обстоятельствах, то можно использовать CLR процедуру или event notification. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 18:28 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
ShIgorпочему проверку экзакт_стэйт на -1 я не могу поставить ни в usp_inner, ни в текстовую строку никакими способамПотому что до выполнения DSQL дело не доходит - ваша процедура падает на его компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 18:29 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
Вернее так: Ошибки 208 - batch termination, а 22105 - нет Соответственно, при наличии ut_test дело доходит до select top 1, возникает ошибка и управление уходит в блок catch при отсутствии ut_test - падает на компиляции и опять же управление уходит в блок catch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 18:42 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
invm, не совсем. 22105 - не разрешен CT - попадаем в catch 208 - нет таблы с откатом - попадаем в catch 3930 - нет таблы без отката - в catch тоже попадаем, но никаких транзакционных операций сделать не можем пока не откатимся замените insert на print и увидите вот такую картину: Код: plaintext 1. 2. 3. 4. 5. 6. 7. так вот и вопрос, явная транзакция была начата в DSQL, что она там и не откатилась-то сама по его завершении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 22:19 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
ShIgorтак вот и вопрос, явная транзакция была начата в DSQL, что она там и не откатилась-то сама по его завершении?С чего вдруг она должна была откатиться? Потому что xact_abort = on? Ну так не оборачивайте в try/catch и откатится. А если оборачивать, то в блоке catch эта транзакция будет в нефиксируемом состоянии. felix_ff вам об этом уже писал. В результате, если заменить insert на print или select будет ошибка 266 при завершении usp_outer при первом вызове. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 22:49 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
и еще инфа к размышлению. В первом тесте DSQL генерит ошибку на этапе компиляции и к его выполнению не приступает. поэтому и явной транзакции нет, и не надо ничего откатывать. Во втором - на этапе выполнения. тоже легко проверить добавив принт в DSQL. С запуском явной транзакции. ПОЧЕМУ!!! Неужели отсутствие объекта для компилятора меньшее зло нежели отсутствие настроек существующего объекта? repro 2 Код: sql 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. Messages с комментариями--1 DSQL отсутствует потому что ошибка на этапе компиляции catch 1 err: Отслеживание изменений не включено для таблицы "ut_test". после 1го exec usp_outer 2 DSQL catch 2 err: Недопустимое имя объекта "ut_test". -- В catch все-таки попадаем и ошибку правильную получаем, но стартованная явная транзакция в DSQL обрывает весь batch Msg 266, Level 16, State 2, Procedure usp_outer, Line 0 [Batch Start Line 50] Счетчик транзакций после выполнения EXECUTE показывает несовпадение числа инструкций BEGIN и COMMIT. Предыдущее число = 0, текущее число = 1. после 2го exec usp_outer Msg 3998, Level 16, State 1, Line 51 Нефиксируемая транзакция обнаружена в конце пакета. Был выполнен откат транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2019, 23:22 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
ShIgor, просто напишите set xact_abort off, если пользуетесь try catch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 12:47 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов, еще хуже. если не откатить, то даже подчистка колом встает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 16:11 |
|
||
|
Поведение try/catch в разных версиях SQL
|
|||
|---|---|---|---|
|
#18+
ShIgor, от каких ошибок Вы хотите защититься, от ошибок компиляции или от ошибок рантайма? Или хотите журналировать ошибки? Не совсем понятны цели этого обсуждения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2019, 16:29 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39772936&tid=1688289]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
132ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 276ms |
| total: | 515ms |

| 0 / 0 |
