IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
Aleksandr.
- Сообщения: 63
- Зарегистрирован: 18 май 2005, 19:13
Сообщение
Aleksandr. » 31 мар 2006, 14:27
В базе есть два вида, использующие подзапрос к таблице TABLE1. При попытке сделать DROP TABLE TABLE1 возникает ошибка unsuccessfull metadata... до тех пор, пока виды не будут также дропнуты. Так как программа работает с таблицами и видами унифицированно, нужен общий механизм для вычисления таких зависимостей и их сноса. Я попытался искать зависимости так:
Код: Выделить всё
select rdb$dependent_name from rdb$dependencies WHERE UPPER(rdb$depended_on_name)=UPPER('TABLE1')
однако в rdb$dependencies не видно явных имен видов, использующих задаваемую таблицу, хотя через тот же IbExpert видно, что эти зависимости есть. Как еще можно получить имена объектов базы, зависимых от таблицы?
-
Merlin
- Динозавр IB/FB
- Сообщения: 1502
- Зарегистрирован: 27 окт 2004, 11:44
Сообщение
Merlin » 31 мар 2006, 14:32
Третий диалект и квотированные идентификаторы?
-
Aleksandr.
- Сообщения: 63
- Зарегистрирован: 18 май 2005, 19:13
Сообщение
Aleksandr. » 31 мар 2006, 14:34
Сорри, FireBird 1.5, dialect 3, квотированные названия полей.
-
Merlin
- Динозавр IB/FB
- Сообщения: 1502
- Зарегистрирован: 27 окт 2004, 11:44
Сообщение
Merlin » 31 мар 2006, 14:37
Тады пожалуй забудь про Upper и подавай запросу названия таблиц как есть, соблюдая регистр. Я не большой спец в возне с charsets-collates, но в системных таблицах оно NONE, у тебя другой, что и как оно там наапперит - я ХЗ.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 31 мар 2006, 14:39
IBExpert, кажись, зависимости отлавливает самостоятельно. В rdb$dependencies, иногда, зависимости могут присутствовать без объектов, или отсутствовать при наличии связей между объектами. То есть, такие "перекосы" - это результаты некоторых действий с DDL.
посмотреть, как там чего IBE берет, можно у него в SQL Monitor.
-
Merlin
- Динозавр IB/FB
- Сообщения: 1502
- Зарегистрирован: 27 окт 2004, 11:44
Сообщение
Merlin » 31 мар 2006, 14:52
kdv писал(а):В rdb$dependencies, иногда, зависимости могут присутствовать без объектов,
Не встречал с момента перехода на FB0.9.1 в январе 2000 года. На IB4 - регулярно. И даже вычислил как это происходило, но уже за ненадобностью забыл.
kdv писал(а):
или отсутствовать при наличии связей между объектами.
тогда и на Drop Table сервак их зевнёт.
kdv писал(а):
То есть, такие "перекосы" - это результаты некоторых действий с DDL.
Имеешь в виду хаки?

Или некоммиченный DDL? Теоретически ещё может быть битый индекс на rdb$dependencies. Но имхо тут если сунуть квотированный идентификатор как есть, всё срастётся.
-
Aleksandr.
- Сообщения: 63
- Зарегистрирован: 18 май 2005, 19:13
Сообщение
Aleksandr. » 31 мар 2006, 15:12
Merlin писал(а):
Теоретически ещё может быть битый индекс на rdb$dependencies.
Я сделал backup/restore базе на такой случай, не помогло.
Merlin писал(а):
Но имхо тут если сунуть квотированный идентификатор как есть, всё
срастётся.
Так выборка всех записей, без проверки по имени из rdb$dependencies тоже показывает отсутствие явно именованных видов. Есть целых два именованных указания на вид, созданный из заданной таблицы, и есть большая пачка каких-то чисел, тип которых не вид (=3).
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 31 мар 2006, 15:20
Имеешь в виду хаки? Wink Или некоммиченный DDL?
да, имею в виду глюки при определенных последовательностях DDL без автокоммита.
-
Aleksandr.
- Сообщения: 63
- Зарегистрирован: 18 май 2005, 19:13
Сообщение
Aleksandr. » 31 мар 2006, 15:27
kdv писал(а):IBExpert, кажись, зависимости отлавливает самостоятельно. В rdb$dependencies, иногда, зависимости могут присутствовать без объектов, или отсутствовать при наличии связей между объектами. То есть, такие "перекосы" - это результаты некоторых действий с DDL.
посмотреть, как там чего IBE берет, можно у него в SQL Monitor.
Спасибо, я воспользовался Вашим советом, но прикол оказался в том, что "ручной" повтор в IbExpert'e этих самых запросов дает отсутствие записей

-
Aleksandr.
- Сообщения: 63
- Зарегистрирован: 18 май 2005, 19:13
Сообщение
Aleksandr. » 03 апр 2006, 12:25
Сорри, пропустил запросец. Запрос из эксперта, который показывает все зависимосити:
Код: Выделить всё
select D1.RDB$DEPENDENT_NAME, D1.RDB$FIELD_NAME, D1.RDB$DEPENDENT_TYPE, R1.rdb$relation_name
from RDB$DEPENDENCIES D1
left join rdb$relations r1 on ((D1.RDB$DEPENDENT_NAME = r1.rdb$relation_name) and (not (r1.Rdb$View_Blr is null)))
where (D1.RDB$DEPENDED_ON_TYPE = 0)
and (D1.RDB$DEPENDENT_TYPE <> 3)
and (UPPER(D1.RDB$DEPENDED_ON_NAME) = 'TABLE1')
union
select distinct f2.rdb$relation_name, d2.rdb$field_name, d2.rdb$dependent_type, r2.rdb$relation_name
from rdb$dependencies d2, rdb$relation_fields f2
left join rdb$relations r2 on ((f2.rdb$relation_name = r2.rdb$relation_name) and (not (r2.Rdb$View_Blr is null)))
where (d2.rdb$dependent_type = 3) and
(d2.rdb$dependent_name = f2.rdb$field_source)
and (UPPER(d2.rdb$depended_on_name) = 'TABLE1')
order by 1, 2
Это мне с потрохами все выдало
