Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Куда пропадает временная таблица, созданная в триггере?
|
|||
|---|---|---|---|
|
#18+
Дано. 1. Informix v10.00TC5 на WinXP#SP2. 2. Кривой софт, который (предположительно) думает, что если update не содержит синтаксических ошибок - то он выполняется и во время его выполнения ничего особенного произойти не может. Поэтому, видимо, не опрашивает ошибки после выполнения update-ов(и не только). В результате, если апдейт обламывается по какому-то условию в триггере, то софт не показывает триггерную диагностику и понять что же именно не понравилось триггеру юзер не может. С целью исправить положение задуман нехитрый костыль - эксцепшены перехватываются и переадресуются в процедуру, которая создает временную таблицу, помещает туда диагностику и потом делает raise exception. Софт читает эту таблицу и показывает юзеру ругань, если она есть. Засада обнаружилась в том, что все, вроде бы, работает как надо, но временная таблица, созданная в триггере куда-то исчезает, и клиентский софт не может прочесть из нее ошибки :( Вот пример. Создаем процедуру StoreError функциональный аналог raise exception, которая создает временную таблицу Errors_Table, заносит туда ошибку и поднимает эксцепшен. С целью убедиться, что таблица создается - добавлена выборка, которая добавляет к диагностике число занесенных в таблицу строк. Далее - создаем таблицу testtab. По ней - вьюшку testvw. Создаем процедуру-обработчик будущего триггера TestTrigProc. Далее на вьюшку вешаем триггер instead of update. Вставляем во вьюшку одну строку, пытаемся выполнить апдейт по вьюшке (который должен слететь в обработчике триггера) и пытаемся выбрать ошибки из Errors_Table. Все работает вроде бы как и было задумано, вот только в конце - 42S02:-206:[Informix][Informix ODBC Driver][Informix]The specified table (errors_table) is not in the database. ISAM error:-111 Инструкцию читал на create temp table и на create trigger - вроде нигде ограничений на невозможность создания временных таблиц в обработчике триггера не нашел. Отсюда резонный вопрос - куда девается УСПЕШНО СОЗДАННАЯ таблица? О том, что она создается я сужу по диагностике "test + 1 records in Errors_Table" Собственно, код: Код: plaintext 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. А вот лог выполнения этого кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Подскажите плиз, где искать истину. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 02:47 |
|
||
|
Куда пропадает временная таблица, созданная в триггере?
|
|||
|---|---|---|---|
|
#18+
Временная таблица видна только для той сессии, в которой была создана ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2007, 23:13 |
|
||
|
Куда пропадает временная таблица, созданная в триггере?
|
|||
|---|---|---|---|
|
#18+
bk0010Временная таблица видна только для той сессии, в которой была создана Да это-то понятно, что таблица видна только в пределах одной сессии. Так ведь тут все выполняется на одной сессии, и при этом тестовая таблица создается, а потом исчезает :( Я могу думать только в сторону того, что при начале выполнения триггера начинается транзакция, создается таблица, потом в триггере происходит эксцепшен, вся транзакция откатывается и вместе с ней убивается и временная таблица. Это единственное мое объяснение данному поведению, хотя я создаю временную таблицу with no log, и поэтому рассчитывал, что она не будет откатываться вместе с транзакцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2007, 03:13 |
|
||
|
Куда пропадает временная таблица, созданная в триггере?
|
|||
|---|---|---|---|
|
#18+
falcon111Я могу думать только в сторону того, что при начале выполнения триггера начинается транзакция, создается таблица, потом в триггере происходит эксцепшен, вся транзакция откатывается и вместе с ней убивается и временная таблица. Именно так и есть. falcon111 Это единственное мое объяснение данному поведению, хотя я создаю временную таблицу with no log, и поэтому рассчитывал, что она не будет откатываться вместе с транзакцией. Зря расчитывал. Используй raw table. См."Как внутри транзакции сохранить записи в журнале даже после отката ?" ( http://www.sql.ru/faq/faq_topic.aspx?fid=809 ) И попробуй все таки попользоваться FAQ, хотя бы иногда - будешь удивлен, сколько там ответов на твои вопросы, которые даже еще не поставлены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2007, 12:26 |
|
||
|
|

start [/forum/topic.php?fid=44&gotonew=1&tid=1608381]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
8ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 311ms |
| total: | 444ms |

| 0 / 0 |
