powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Куда пропадает временная таблица, созданная в триггере?
4 сообщений из 4, страница 1 из 1
Куда пропадает временная таблица, созданная в триггере?
    #34570878
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дано.
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.
create procedure StoreError (
  SQL_Error  integer,
  ISAM_Error smallint,
  Error_Text varchar( 255 )
  )

  define i integer;

  begin
    on exception in (- 958 ) -- Temp table <table-name> already exists in session
    end exception with resume;
    create temp table Errors_Table (
      E_SQL  integer,
      E_ISAM smallint,
      E_Text varchar( 255 )
    ) with no log;
  end;

  insert into Errors_Table(E_SQL, E_ISAM, E_Text) values(SQL_Error, ISAM_Error, Error_Text);

  select count(*) into i from Errors_Table;

  raise exception SQL_Error, ISAM_Error, Error_Text||' + '||i||' records in Errors_Table';

  return;
end procedure;
revoke execute on StoreError from public;
update statistics for procedure StoreError;

create table testtab (
  i serial,
  j varchar( 16 )
);
revoke all on testtab from public;

create view testvw(a, b) as select i, j from testtab;
grant select, insert, update, delete on testvw to public;

create procedure TestTrigProc (
  f1 like testtab.i,
  f2 like testtab.j
  )

  execute procedure StoreError(- 746 ,  0 , 'test');

  return;
end procedure;
revoke execute on TestTrigProc from public;
update statistics for procedure TestTrigProc;

create trigger test_trig instead of update on testvw
  referencing new as n old as o
  for each row
  (execute procedure TestTrigProc(o.a, n.b));


insert into testvw(a, b) values( 1 ,'a');
update testvw set b='b';
update testvw set b='c';
select * from Errors_Table;

--cleanup
drop trigger test_trig;
drop procedure TestTrigProc;
drop view testvw;
drop table testtab;
drop procedure StoreError;

А вот лог выполнения этого кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Command line sql-crawler v0. 18 /w32, by Alexander "Falcon" Kryzhanovsky.
Successfully connected to test as user informix.
Procedure successfully created.
Privilege successfully revoked.
Statistics successfully updated.
Table successfully created.
Privilege successfully revoked.
View successfully created.
Privilege successfully granted.
Procedure successfully created.
Privilege successfully revoked.
Statistics successfully updated.
Trigger successfully created.
 1  rows were inserted.
HY000:- 746 :[Informix][Informix ODBC Driver][Informix]test +  1  records in Errors_Table
HY000:- 746 :[Informix][Informix ODBC Driver][Informix]test +  1  records in Errors_Table
42S02:- 206 :[Informix][Informix ODBC Driver][Informix]The specified table (errors_table) is not in the database.
ISAM error:- 111 
Trigger successfully dropped.
Procedure successfully dropped.
View successfully dropped.
Table successfully dropped.
Procedure successfully dropped.

Подскажите плиз, где искать истину.
Заранее спасибо.
...
Рейтинг: 0 / 0
Куда пропадает временная таблица, созданная в триггере?
    #34573678
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Временная таблица видна только для той сессии, в которой была создана
...
Рейтинг: 0 / 0
Куда пропадает временная таблица, созданная в триггере?
    #34573807
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bk0010Временная таблица видна только для той сессии, в которой была создана

Да это-то понятно, что таблица видна только в пределах одной сессии. Так ведь тут все выполняется на одной сессии, и при этом тестовая таблица создается, а потом исчезает :(

Я могу думать только в сторону того, что при начале выполнения триггера начинается транзакция, создается таблица, потом в триггере происходит эксцепшен, вся транзакция откатывается и вместе с ней убивается и временная таблица. Это единственное мое объяснение данному поведению, хотя я создаю временную таблицу with no log, и поэтому рассчитывал, что она не будет откатываться вместе с транзакцией.
...
Рейтинг: 0 / 0
Куда пропадает временная таблица, созданная в триггере?
    #34574649
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
falcon111Я могу думать только в сторону того, что при начале выполнения триггера начинается транзакция, создается таблица, потом в триггере происходит эксцепшен, вся транзакция откатывается и вместе с ней убивается и временная таблица.
Именно так и есть.
falcon111
Это единственное мое объяснение данному поведению, хотя я создаю временную таблицу with no log, и поэтому рассчитывал, что она не будет откатываться вместе с транзакцией.
Зря расчитывал. Используй raw table. См."Как внутри транзакции сохранить записи в журнале даже после отката ?" ( http://www.sql.ru/faq/faq_topic.aspx?fid=809 )
И попробуй все таки попользоваться FAQ, хотя бы иногда - будешь удивлен, сколько там ответов на твои вопросы, которые даже еще не поставлены.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Куда пропадает временная таблица, созданная в триггере?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]