powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Влияние COMMIT / ROLLBACK / <empty line> при DDL-ошибках внутри execute block'ах на STDERR
3 сообщений из 3, страница 1 из 1
Влияние COMMIT / ROLLBACK / <empty line> при DDL-ошибках внутри execute block'ах на STDERR
    #38975726
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

DDL-1 (сразу смотрим в нём на выделенные строки).
=====
Код: 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.
commit;
set echo on;
recreate table test(id int);
commit;
insert into test values(1);
commit;
create index test_id on test(id);
commit;

set term ^;
execute block as
begin
    execute statement 'drop role WRECKER';
when any do begin end
end
^ set term ;^
commit;


set transaction no wait;
set plan on;
select * from test where id>0;

set term ^;

execute block as
begin

  execute statement 'drop index test_id'
  on external 'localhost:'||rdb$get_context('SYSTEM','DB_NAME')
  as user 'sysdba' password 'masterkey' role 'WRECKER';
  
end
^

execute block as
begin

  execute statement 'drop table test'
  on external 'localhost:'||rdb$get_context('SYSTEM','DB_NAME')
  as user 'sysdba' password 'masterkey' role 'WRECKER';
  
end
^

set term ;^
 -- W/O commit or rollback: one msg about table (and no msg about index)
--commit; -- two msg, both about table (no about index again!)
--rollback; -- no msg at all! 

set list on;
select * from rdb$indices where rdb$index_name = upper('test_id');
Вывод в STDERR будет таким, как это указано в выделенных строках этого DDL, а именно:

1) когда после завершающего set term ;^ нет ни commit'a ни rollback'a (и неважно при этом, продолжается ли далее скрипт какой-нибудь DML-командой типа "select * from ..."):
Код: plaintext
1.
2.
3.
4.
5.
6.
Statement failed, SQLSTATE = 42000
Execute statement error at transaction commit :
335544345 : lock conflict on no wait transaction
335544351 : unsuccessful metadata update
335544453 :  object TABLE "TEST"  is in use
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 52 in file c4386.1.sql

Таким обр, тут нету сообщения про облом DROP INDEX'a.

2) когда после set term ;^ есть COMMIT - будет два сообщения, но оба - про облом drop TABLE, про индекс - опять ничего:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Statement failed, SQLSTATE = 42000
Execute statement error at transaction commit :
335544345 : lock conflict on no wait transaction
335544351 : unsuccessful metadata update
335544453 :  object TABLE  "TEST" is in use
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 46 in file c4386.1.sql
Statement failed, SQLSTATE = 42000
Execute statement error at transaction commit :
335544345 : lock conflict on no wait transaction
335544351 : unsuccessful metadata update
335544453 :  object TABLE  "TEST" is in use
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 52 in file c4386.1.sql


3) когда после set term ;^ есть ROLLBACK... сообщений об обломах не будет вообще(!).

########################################################################################

DDL-2 (также сразу смотрим в нём на выделенные строки).
=====
Отличается от первого только изменённым порядком того, что хотим дропнуть: раньше хотели сначала индекс, затем - таблицу; теперь - наоборот:
Код: 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.
commit;
set echo on;
recreate table test(id int);
commit;
insert into test values(1);
commit;
create index test_id on test(id);
commit;

set term ^;
execute block as
begin
    execute statement 'drop role WRECKER';
when any do begin end
end
^ set term ;^
commit;

set transaction no wait;

set plan on;
select * from test where id>0;

set term ^;

execute block as
begin

  execute statement 'drop table test'
  on external 'localhost:'||rdb$get_context('SYSTEM','DB_NAME')
  as user 'sysdba' password 'masterkey' role 'WRECKER';
  
end
^

execute block as
begin

  execute statement 'drop index test_id'
  on external 'localhost:'||rdb$get_context('SYSTEM','DB_NAME')
  as user 'sysdba' password 'masterkey' role 'WRECKER';
  
end
^

set term ;^
 -- w/o commit or rollback: two msg, but order is exchanged: 1st about INDEX, 2nd about TABLE
--commit; -- THREE msgs: 1 - about index; 2 and 3 - about table;
-- rollback; -- one msg about index, no msg about drop table 

Здесь "картина маслом" следующая:
1) когда после set term ;^ нет ни commit'a ни rollback'a, сообщения будет два, и оба объекта (таблица и индекс) будут в них упомянуты. Но порядок будет "перепутанным":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Statement failed, SQLSTATE = 42000
Execute statement error at isc_dsql_execute2 :
335544351 : unsuccessful metadata update
336397305 :  DROP INDEX TEST_ID  failed
336068656 : Index not found
Statement : drop index test_id
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 34 in file c4386.2.sql
Statement failed, SQLSTATE = 42000
Execute statement error at transaction commit :
335544345 : lock conflict on no wait transaction
335544351 : unsuccessful metadata update
335544453 :  object TABLE  "TEST" is in use
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 47 in file c4386.2.sql
Кроме того, в выводе есть странная фраза "Index not found", хотя ясен пень, что никуда этот индекс не делся.

2) когда после set term ;^ есть COMMIT, вылезет три сообщения(!), первое про индекс, остальные - про таблицу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Statement failed, SQLSTATE = 42000
Execute statement error at isc_dsql_execute2 :
335544351 : unsuccessful metadata update
336397305 :  DROP INDEX  TEST_ID failed
336068656 : Index not found
Statement : drop index test_id
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 34 in file c4386.2.sql
Statement failed, SQLSTATE = 42000
Execute statement error at transaction commit :
335544345 : lock conflict on no wait transaction
335544351 : unsuccessful metadata update
335544453 :  object TABLE  "TEST" is in use
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 47 in file c4386.2.sql
Statement failed, SQLSTATE = 42000
Execute statement error at transaction commit :
335544345 : lock conflict on no wait transaction
335544351 : unsuccessful metadata update
335544453 :  object TABLE  "TEST" is in use
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 49 in file c4386.2.sql
Порядок сообщений опять перепутанный: я в этом скрипте сначала пытаюсь дропнуть ТАБЛИЦУ, а не индекс! Про лишнюю мессагу вообще уж молчу.

3) когда после set term ;^ есть ROLLBACK, вылезет только одно сообщение, про индекс. Про таблицу - ни слова:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Statement failed, SQLSTATE = 42000
Execute statement error at isc_dsql_execute2 :
335544351 : unsuccessful metadata update
336397305 : DROP INDEX TEST_ID failed
336068656 : Index not found
Statement : drop index test_id
Data source : Firebird::localhost:C:\MIX\firebird\QA\fbt-repo\tmp\E30.FDB
After line 34 in file c4386.2.sql
Оставляя за бортом то, что "так делать нельзя, надо всё DDL в моно-коннекте", объясните кто-нить: что за бардак с вывалом в STDERR ? Откудова тут перепутанный порядок вывода мессаг, но главное - отсутствие в некоторых случаях части ошибок или вообще их всех ?
...
Рейтинг: 0 / 0
Влияние COMMIT / ROLLBACK / <empty line> при DDL-ошибках внутри execute block'ах на STDERR
    #38975734
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. Проверено на:
WI-V2.5.5.26879
WI-T3.0.0.31855
...
Рейтинг: 0 / 0
Влияние COMMIT / ROLLBACK / <empty line> при DDL-ошибках внутри execute block'ах на STDERR
    #38975757
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас всё расписывать не буду, в двух словах - всё ок, как и должно быть.
Если ты вспомнишь, что бОльшая часть DDL выполняется по коммиту, то и
сам всё поймёшь. Наверное.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Влияние COMMIT / ROLLBACK / <empty line> при DDL-ошибках внутри execute block'ах на STDERR
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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