Страница 1 из 1

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

Добавлено: 31 мар 2006, 14:27
Aleksandr.
В базе есть два вида, использующие подзапрос к таблице TABLE1. При попытке сделать DROP TABLE TABLE1 возникает ошибка unsuccessfull metadata... до тех пор, пока виды не будут также дропнуты. Так как программа работает с таблицами и видами унифицированно, нужен общий механизм для вычисления таких зависимостей и их сноса. Я попытался искать зависимости так:

Код: Выделить всё

select rdb$dependent_name from rdb$dependencies WHERE UPPER(rdb$depended_on_name)=UPPER('TABLE1')
однако в rdb$dependencies не видно явных имен видов, использующих задаваемую таблицу, хотя через тот же IbExpert видно, что эти зависимости есть. Как еще можно получить имена объектов базы, зависимых от таблицы?

Добавлено: 31 мар 2006, 14:32
Merlin
Третий диалект и квотированные идентификаторы?

Добавлено: 31 мар 2006, 14:34
Aleksandr.
Сорри, FireBird 1.5, dialect 3, квотированные названия полей.

Добавлено: 31 мар 2006, 14:37
Merlin
Тады пожалуй забудь про Upper и подавай запросу названия таблиц как есть, соблюдая регистр. Я не большой спец в возне с charsets-collates, но в системных таблицах оно NONE, у тебя другой, что и как оно там наапперит - я ХЗ.

Добавлено: 31 мар 2006, 14:39
kdv
IBExpert, кажись, зависимости отлавливает самостоятельно. В rdb$dependencies, иногда, зависимости могут присутствовать без объектов, или отсутствовать при наличии связей между объектами. То есть, такие "перекосы" - это результаты некоторых действий с DDL.

посмотреть, как там чего IBE берет, можно у него в SQL Monitor.

Добавлено: 31 мар 2006, 14:52
Merlin
kdv писал(а):В rdb$dependencies, иногда, зависимости могут присутствовать без объектов,
Не встречал с момента перехода на FB0.9.1 в январе 2000 года. На IB4 - регулярно. И даже вычислил как это происходило, но уже за ненадобностью забыл.
kdv писал(а): или отсутствовать при наличии связей между объектами.
тогда и на Drop Table сервак их зевнёт.
kdv писал(а): То есть, такие "перекосы" - это результаты некоторых действий с DDL.
Имеешь в виду хаки? ;) Или некоммиченный DDL? Теоретически ещё может быть битый индекс на rdb$dependencies. Но имхо тут если сунуть квотированный идентификатор как есть, всё срастётся.

Добавлено: 31 мар 2006, 15:12
Aleksandr.
Merlin писал(а): Теоретически ещё может быть битый индекс на rdb$dependencies.
Я сделал backup/restore базе на такой случай, не помогло.
Merlin писал(а): Но имхо тут если сунуть квотированный идентификатор как есть, всё
срастётся.
Так выборка всех записей, без проверки по имени из rdb$dependencies тоже показывает отсутствие явно именованных видов. Есть целых два именованных указания на вид, созданный из заданной таблицы, и есть большая пачка каких-то чисел, тип которых не вид (=3).

Добавлено: 31 мар 2006, 15:20
kdv
Имеешь в виду хаки? Wink Или некоммиченный DDL?
да, имею в виду глюки при определенных последовательностях DDL без автокоммита.

Добавлено: 31 мар 2006, 15:27
Aleksandr.
kdv писал(а):IBExpert, кажись, зависимости отлавливает самостоятельно. В rdb$dependencies, иногда, зависимости могут присутствовать без объектов, или отсутствовать при наличии связей между объектами. То есть, такие "перекосы" - это результаты некоторых действий с DDL.

посмотреть, как там чего IBE берет, можно у него в SQL Monitor.
Спасибо, я воспользовался Вашим советом, но прикол оказался в том, что "ручной" повтор в IbExpert'e этих самых запросов дает отсутствие записей :roll:

Добавлено: 03 апр 2006, 12:25
Aleksandr.
Сорри, пропустил запросец. Запрос из эксперта, который показывает все зависимосити:

Код: Выделить всё

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