Неправильная работа Firebird при разборе зависимостей!

Тагир Билалов
Дата: 15.09.2005 14:36:31
мне вот потребовалось при изменении таблицы рекуррентно удалять (а после изменения - воссоздавать) зависящие от нее объекты (вьюшки, процедуры, триггеры). соорудил запрос к RDB$DEPENDENCIES

SELECT DISTINCT D.RDB$DEPENDENT_NAME D_NAME, D.RDB$DEPENDENT_TYPE  D_TYPE
FROM RDB$DEPENDENCIES D
WHERE (D.RDB$DEPENDENT_TYPE IN (1,2,5))
AND (D.RDB$DEPENDED_ON_NAME = 'FObjectName')

и столкнулся с тем, что такой запрос не отбирает триггеры, созданные на вьюшки, собственно, IBExpert использует схожий запрос и оттого в его тулзе DependenciesViewer тот самый злополучный, созданный исключительно для тестирования технологии, триггер на вьюшку тоже не отображается

пока решил в случае вьюшек модифицировать запрос:
SELECT DISTINCT D.RDB$DEPENDENT_NAME D_NAME, CAST(D.RDB$DEPENDENT_TYPE AS INTEGER) D_TYPE
FROM RDB$DEPENDENCIES D
WHERE (D.RDB$DEPENDENT_TYPE IN (1,2,5))
AND (D.RDB$DEPENDED_ON_NAME = 'FObjectName')
UNION
SELECT T.RDB$TRIGGER_NAME D_NAME, CAST(2 AS INTEGER) AS D_TYPE
FROM RDB$TRIGGERS T
WHERE T.RDB$RELATION_NAME = 'FObjectName'

интересно, это баг или фича? версия Firebird 1.5.2, версия IBExpert 2005.04.18.2

заранее извиняюсь, если баян!
kdv
Дата: 15.09.2005 14:52:35
я не понял, этих зависимостей в rdb$dependencies нет? или ЭТОТ запрос их не вытаскивает?
Тагир Билалов
Дата: 15.09.2005 15:00:22
зависимости между этим триггером и вьюшкой вообще в системной табличке нет (хотя, если удалить вьюшку, триггер удаляется автоматически) - ну и соответственно запрос ее и не вылавливает.
Тагир Билалов
Дата: 15.09.2005 15:04:32
поправлюсь - название этого триггера вообще не фигурирует в RDB$DEPENDENCIES
(если интересно - я в его коде только POST_EVENT написал. думается мне, если бы я внутри работал с реальными объектами, зависимости бы появились. щас проверю)
Тагир Билалов
Дата: 15.09.2005 15:10:43
ага! добавил в код триггера селект (из другой вьюшки!) и вызов процедуры - обе зависимости попали в RDB$DEPENDENCIES (что прикольно, для зависимости триггер-вьюшка поле RDB$DEPENDED_ON_TYPE равно 0, а не 1, как вроде должно быть по документации), а зависимости от той вьюшки, на которой был создан триггер, как не было, так и нет!
Тагир Билалов
Дата: 15.09.2005 15:24:12
то триггер на таблицу, внутри которого единственный оператор POST_EVENT, также не попадает в таблицу зависимостей!
Гаджимурадов Рустам
Дата: 15.09.2005 15:59:40
Тагир Билалов
то триггер на таблицу, внутри которого единственный оператор POST_EVENT, также не попадает в таблицу зависимостей!
А дока молчит по этому поводу? Может быть на события даже BLR не создается.
Это тебе у разработчиков надо спрашивать.
hvlad
Дата: 15.09.2005 16:10:02
Если триггер не использует ни OLD, ни NEW, и не обращается к таблице явно, то зависимости от таблицы нет.
Тагир Билалов
Дата: 15.09.2005 16:11:26
Гаджимурадов Рустам
А дока молчит по этому поводу?

даже и не знаю, где поискать такие доки! ведь это уже достаточно углубленное знание - у меня так вообще стандартный комплект документации по Interbase 6, там есть только описания системных таблиц.
Может быть на события даже BLR не создается.

это может быть, но, как я писал выше, даже если заменить текст на нечто более созидательное, но не включающее саму таблицу/вьюшку или переменные :NEW или :OLD, зависимость не создается!
Это тебе у разработчиков надо спрашивать.

А где их искать, разработчиков-то? Они бывают в этом форуме?
barry
Дата: 15.09.2005 16:12:37
> то триггер на таблицу, внутри которого единственный оператор POST_EVENT, также не попадает в таблицу зависимостей!

В rdb$triggers есть ссылка на свою таблицу (view) - поле rdb$relation_name. Это как бы понятная и естественная связь (триггер всегда принадлежит таблице), поэтому в rdb$dependencies такое не пишется. Там в основном связи... не знаю даже как научно правильно сказать, в общем типа случайные, непостоянные, хаотичные. Также и нету к примеру привязки индекса к таблице (это в rdb$indices), привязки полей к своей таблице (это в rdb$relation_fields) и т.п. Т.е. то что постоянно привязано как само собой разумеющееся и есть в других системных таблицах в rdb$dependencies не пишется.
Ну и надо также учитывать что в серверах IB/FB практически всех версий есть глюки, когда в rdb$dependencies не записаны реально существующие связи (кое-что пропускают).


Posted via ActualForum NNTP Server 1.3