Как получить имена зависимостей таблицы?

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 этих самых запросов дает отсутствие записей :roll:

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
Это мне с потрохами все выдало :)

Ответить