Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Странное поведение begin atomic / 2 сообщений из 2, страница 1 из 1
05.10.2005, 15:16
    #33306602
Alex F.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение begin atomic
Всем привет!

Сервер ASA 9.0.2.3137.

в хранимой процедуре есть конструкция вида
begin atomic
insert into table1...
update table2...
insert into table3..
и т.п.
end
на одну из таблиц (например, table1) навешен триггер, который обновляет table4.
Проблема в том, что после выполнения этой хранимой процедуры, изменения сделанные триггером откатываются, а все остальные изменения, заключенные между begin atomic и end - нет.
Т.е. этот блок begin-end успешно выполнился, а изменения, сделанные триггером тем не менее откатились. То, что триггер срабатывает, видно в отладчике.

У кого-нибудь есть идеи, почему так может происходит?

Александр
...
Рейтинг: 0 / 0
05.10.2005, 18:20
    #33307261
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение begin atomic
Попробовал (ASA 9.0.2.2451), не повторилось. Вот скрипт как я пробовал. Модифицируй его чтобы повторить найденый глюк.
Код: 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.
create table t1(
	id integer primary key,
	t1 char( 10 )
);

create table t2(
	id integer primary key,
	idt1 integer,
	t2 char( 10 )
);

create trigger tr_t1 after insert on t1 
	referencing new as new_row
	for each row
begin
	declare mId integer;
	select isnull(max(id), 0 )+ 1  into mId from t2;
	insert into t2 values (mId, new_row.id, new_row.t1);
end;

begin
	declare mC1 integer; declare mC2 integer;
	select count(*) into mC1 from t1;
	select count(*) into mC2 from t2;
	message 'before insert  t1: ' || mC1 || '  t2: ' || mC2 to client;

	begin 
		insert into t1 values( 1 , 'aaa');
	end;
	select count(*) into mC1 from t1;
	select count(*) into mC2 from t2;
	message 'after insert  t1: ' || mC1 || '  t2: ' || mC2 to client;

	rollback;
	select count(*) into mC1 from t1;
	select count(*) into mC2 from t2;
	message 'after rollback t1: ' || mC1 || '  t2: ' || mC2 to client;

	begin atomic
		insert into t1 values( 2 , 'bbb');
	end;
	select count(*) into mC1 from t1;
	select count(*) into mC2 from t2;
	message 'after insert  t1: ' || mC1 || '  t2: ' || mC2 to client;

	rollback;
	select count(*) into mC1 from t1;
	select count(*) into mC2 from t2;
	message 'after rollback t1: ' || mC1 || '  t2: ' || mC2 to client;
end;
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Странное поведение begin atomic / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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