ODBC, транзакции и удаление таблиц/представлений

удаляю представления
Дата: 14.06.2012 14:44:22
Всем привет. Моя программа иногда удаляет представления (DROP VIEW), если для представления имеется открытый в другой сессии курсор (рекордсет, я использую ODBC драйвер) то получаю ошибку что объект, мол занят, и т.д. - это нормально. Проблема происходит когда имеется несколько представлений зависящих друг от друга и всю эту цепочку надо удалить (нужно удалить именно все или все должны остаться). Например, есть два представление CREATE VIEW v1 AS SELECT * FROM t1 и CREATE VIEW v2 AS SELECT * FROM v1 Удаление v2 проходит нормально, а v1 открыто в другой сессии и мы получаем вышеупомянутую ошибку. Для решения проблемы я хотел выполнить оба удаления в одной транзакции, но при этом при удалении второго представления ошибки не происходит, т.е. после коммита представления остаются не удаленными. Параметры транзакции, дефолтные для Firebird ODBC driver 2.0.1.152, как я понимаю, READ COMMITTED REC_VERSION NOWAIT Почему после коммита транзакции ODBC драйвер не сообщает что объект используется? Да, версия сервера 2.5.1 релиз

То же самое происходит и с таблицами, т.е. если в одной сессии открыть таблицу, а в другой попытаться ее удалить начав при этом транзакцию, то при коммите ничего не происходит. В режиме автокоммита выдается правильное сообщение.
Таблоид
Дата: 14.06.2012 17:09:51
удаляю представления
Для решения проблемы я хотел выполнить оба удаления в одной транзакции, но при этом при удалении второго представления ошибки не происходит, т.е. после коммита представления остаются не удаленными.


Prepare:
C:\MIX\firebird\fb25>isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> create database 'tmp120614.fdb'; commit;
SQL> create table t1(id int, f01 int); commit;
SQL> insert into t1 values(1,100);
SQL> insert into t1 values(3,300);
SQL> insert into t1 values(2,200);
SQL> commit;
SQL> create or alter view v1 as select f01/2 h, id*2 i from t1;
SQL> commit;
SQL> create or alter view v2 as select power(h,2) h2, power(i,2) i2 from v1;
SQL> commit;
SQL> create or alter view v3 as select sqrt(h2) hq, sqrt(i*3) iq from v2;
SQL> create or alter view v3 as select sqrt(h2) hq, sqrt(i2) iq from v2;
SQL> commit;

session #1
C:\MIX\firebird\fb25>isql TMP120614.FDB
Database: TMP120614.FDB
SQL> select * from v1 union all select * from v2 union all select * from v3;

H I
======================= =======================
50.00000000000000 2.000000000000000
150.0000000000000 6.000000000000000
100.0000000000000 4.000000000000000
2500.000000000000 4.000000000000000
22500.00000000000 36.00000000000000
10000.00000000000 16.00000000000000
50.00000000000000 2.000000000000000
150.0000000000000 6.000000000000000
100.0000000000000 4.000000000000000

session 2:
C:\MIX\firebird\fb25>isql TMP120614.FDB
Database: TMP120614.FDB
SQL> set bail on;
SQL> set autoddl off;
SQL> commit;
SQL> set transaction lock timeout 3;
SQL> drop view v3;
SQL> drop view v2;
SQL> drop view v1;
SQL> commit;
Statement failed, SQLSTATE = 40001
lock time-out on wait transaction
-unsuccessful metadata update
-object V3 is in use
SQL> rollback;
SQL> show view;
V1 V2
V3

Все вьюхи, как видим, остались на месте.
удаляю представления
Дата: 14.06.2012 21:08:58
Это замечательно :) При работе через ODBC они тоже остаются, как я уже писал. Но вот как бы мне еще получить это сообщение об ошибке? Коммит проходит молча...