hi all
DDL-1 (сразу смотрим в нём на выделенные строки).
=====
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 ..."):
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, про индекс - опять ничего:
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 (также сразу смотрим в нём на выделенные строки).
=====
Отличается от первого только изменённым порядком того, что хотим дропнуть: раньше хотели сначала индекс, затем - таблицу; теперь - наоборот:
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, сообщения будет два, и оба объекта (таблица и индекс) будут в них упомянуты. Но порядок будет "перепутанным":
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, вылезет три сообщения(!), первое про индекс, остальные - про таблицу:
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, вылезет только одно сообщение, про индекс. Про таблицу - ни слова:
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 ? Откудова тут перепутанный порядок вывода мессаг, но главное - отсутствие в некоторых случаях части ошибок или вообще их
всех ?