powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / db2 - граф зависимых объектов
9 сообщений из 9, страница 1 из 1
db2 - граф зависимых объектов
    #35781068
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
такая задачка - нужно построить граф зависимости между объектами в DB2.
Например, изменение в таблице 1 активизирует триггер1, триггер 1 вызывает процедуру 1,
процедура 1 выбирает записи из вьюхи 1, вьюха 1 выбирает записи из таблицы 2.

Мне нужно получить такую таблицу:

Основной объект| Зависимый объект
таблица 1 | триггер 1
триггер 1 | процедура 1
процедура 1 | вьюха 1
вьюха 1 | таблица 2

Зная такую зависимость можно будет знать что изменив структуру таблицы 2, необходимо будет изменить или перекомпилить все объекты вплоть до таблицы 1. В противном случае вставка в таблицу 1 может завершиться ошибкой.

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


Задача не нова и я надеюсь, что есть готовые решения.

К сожелению сторонние и особенно графические утилиты у нас не разрешены. Есть только DB Artisan и комманднная строка :-(

Подскажите пожалуйста есть ли какие-нибудь системные хранимиые процедуры решающие подобные задачи.

Может быть у кото-то уже есть готовый SQL?

Всем заранее огромное спасибо за помощь.
...
Рейтинг: 0 / 0
db2 - граф зависимых объектов
    #35781895
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Вот попробуйте.
p_btype надо ставить соответственно типу объекта, как, например, тут .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
CREATE FUNCTION OBJ_DEP(
  p_btype varchar( 1 )
, p_bschema varchar( 128 )
, p_bname varchar( 128 )
)
returns table (
  lvl int
, otype char( 1 ), oschema varchar( 128 ), oname varchar( 128 )
, btype char( 1 ), bschema varchar( 128 ), bname varchar( 128 )
)
return
WITH A (LVL, OTYPE, OSCHEMA, ONAME, BTYPE, BSCHEMA, BNAME) AS (
SELECT  1  LVL, OTYPE, OSCHEMA, ONAME, BTYPE, BSCHEMA, BNAME
FROM (
select 
  DTYPE OTYPE, TABSCHEMA OSCHEMA, TABNAME ONAME
, p_btype BTYPE, p_bschema BSCHEMA, p_bname BNAME
from syscat.tabdep
where btype=upper(p_btype) and bschema=upper(p_bschema) and bname=upper(p_bname)
  union all 
select 
  'F' OTYPE, ROUTINESCHEMA OSCHEMA, ROUTINENAME ONAME
, p_btype BTYPE, p_bschema BSCHEMA, p_bname BNAME
from syscat.routinedep
where btype=upper(p_btype) and bschema=upper(p_bschema) and bname=upper(p_bname)
  union all 
select 
  'K' OTYPE, PKGSCHEMA OSCHEMA, PKGNAME ONAME
, p_btype BTYPE, p_bschema BSCHEMA, p_bname BNAME
from syscat.packagedep
where btype=upper(p_btype) and bschema=upper(p_bschema) and bname=upper(p_bname)
  union all 
select 
  'B' OTYPE, TRIGSCHEMA OSCHEMA, TRIGNAME ONAME
, p_btype BTYPE, p_bschema BSCHEMA, p_bname BNAME
from syscat.trigdep
where btype=upper(p_btype) and bschema=upper(p_bschema) and bname=upper(p_bname)
  union all 
select 
  'I' OTYPE, INDSCHEMA OSCHEMA, INDNAME ONAME
, p_btype BTYPE, p_bschema BSCHEMA, p_bname BNAME
from syscat.indexes
where upper(p_btype) in ('T', 'S') and tabschema=upper(p_bschema) and tabname=upper(p_bname)
  union all 
select 
  'I' OTYPE, INDSCHEMA OSCHEMA, INDNAME ONAME
, p_btype BTYPE, p_bschema BSCHEMA, p_bname BNAME
from syscat.indexdep
where btype=upper(p_btype) and bschema=upper(p_bschema) and bname=upper(p_bname)
) T
  UNION ALL
select 
  A.LVL+ 1  LVL
, d.DTYPE OTYPE, d.TABSCHEMA OSCHEMA, d.TABNAME ONAME
, a.otype BTYPE, a.oschema BSCHEMA, a.oname BNAME
from syscat.tabdep d, a
where d.btype=a.otype and d.bschema=a.oschema and d.bname=a.oname
  UNION ALL
select 
  A.LVL+ 1  LVL
, 'F' OTYPE, d.ROUTINESCHEMA OSCHEMA, d.ROUTINENAME ONAME
, a.otype BTYPE, a.oschema BSCHEMA, a.oname BNAME
from syscat.routinedep d, a
where d.btype=a.otype and d.bschema=a.oschema and d.bname=a.oname
  UNION ALL
select 
  A.LVL+ 1  LVL
, 'K' OTYPE, d.PKGSCHEMA OSCHEMA, d.PKGNAME ONAME
, a.otype BTYPE, a.oschema BSCHEMA, a.oname BNAME
from syscat.packagedep d, a
where d.btype=a.otype and d.bschema=a.oschema and d.bname=a.oname
  UNION ALL
select 
  A.LVL+ 1  LVL
, 'B' OTYPE, d.TRIGSCHEMA OSCHEMA, d.TRIGNAME ONAME
, a.otype BTYPE, a.oschema BSCHEMA, a.oname BNAME
from syscat.trigdep d, a
where d.btype=a.otype and d.bschema=a.oschema and d.bname=a.oname
  UNION ALL
select 
  A.LVL+ 1  LVL
, 'I' OTYPE, d.INDSCHEMA OSCHEMA, d.INDNAME ONAME
, a.otype BTYPE, a.oschema BSCHEMA, a.oname BNAME
from syscat.indexdep d, a
where d.btype=a.otype and d.bschema=a.oschema and d.bname=a.oname
  UNION ALL
select 
  A.LVL+ 1  LVL
, 'I' OTYPE, d.INDSCHEMA OSCHEMA, d.INDNAME ONAME
, a.otype BTYPE, a.oschema BSCHEMA, a.oname BNAME
from syscat.indexes d, a
where a.otype in ('T', 'S') and d.tabschema=a.oschema and d.tabname=a.oname
)
SELECT DISTINCT LVL, OTYPE, OSCHEMA, ONAME, BTYPE, BSCHEMA, BNAME
FROM A;
Это без анализа по внешним ключам.
...
Рейтинг: 0 / 0
db2 - граф зависимых объектов
    #35782681
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Пашет.
Если я правильно всё понял (проверял не очень хорошо, правда), то для REFERENCES можно добавить в конец A
Код: plaintext
1.
2.
3.
4.
5.
6.
  union all 
select 
  'T' OTYPE, TABSCHEMA OSCHEMA, TABNAME ONAME
, p_btype BTYPE, 'REF:'||reftabschema BSCHEMA, reftabname BNAME
from syscat.references r
where upper(p_btype) in ('T', 'S') and reftabschema=upper(p_bschema) and reftabname=upper(p_bname)
Я также добавил функцию, для удобства визуального анализа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE FUNCTION OBJ_TYPE(p_btype varchar( 1 ))
returns varchar( 50 )
return case
         when p_btype = 'A' then 'Alias'
         when p_btype = 'B' then 'Trigger'
         when p_btype = 'D' then 'Server definition'
         when p_btype = 'F' then 'Routine instance'
         when p_btype = 'H' then 'Hierachy table'
         when p_btype = 'I' then 'Index'
         when p_btype = 'K' then 'Package'
         when p_btype = 'L' then 'Detached table'
         when p_btype = 'M' then 'Function mapping'
         when p_btype = 'N' then 'Nickname'
         when p_btype = 'O' then 'Privilege dependency on all subtables or subviews in a table or view hierarchy'
         when p_btype = 'P' then 'Page size'
         when p_btype = 'Q' then 'Sequence object'
         when p_btype = 'R' then 'User-defined data type'
         when p_btype = 'S' then 'Materialized query table'
         when p_btype = 'T' then 'Table (untyped)'
         when p_btype = 'U' then 'Typed table'
         when p_btype = 'V' then 'View (untyped)'
         when p_btype = 'W' then 'Typed view'
         when p_btype = 'Z' then 'XSR object'
         when p_btype = 'v' then 'Global variable'
         else 'Unknown'
       end;
Пример использования:
Код: plaintext
1.
2.
SELECT LVL,'('||RTRIM(OBJ_TYPE(OTYPE))||') '||RTRIM(RTRIM(OSCHEMA)||'.'||RTRIM(ONAME))||' :: '||'('||OBJ_TYPE(BTYPE)||') '||RTRIM(RTRIM(BSCHEMA)||'.'||RTRIM(BNAME)) AS DEP
  FROM TABLE(OBJ_DEP('T', 'SCH', 'TABLENAME')) AS T;
Да, мне не очень понравилась конструкция:
Код: plaintext
where btype=upper(p_btype)
поскольку есть типы 'V' и 'v', например. Впрочем, настаивать не буду, возможно я и не прав, просто времени нет проверить ;)
...
Рейтинг: 0 / 0
db2 - граф зависимых объектов
    #35782759
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir KiselevЕсли я правильно всё понял (проверял не очень хорошо, правда), то для REFERENCES можно добавить в конец A
Код: plaintext
1.
2.
3.
4.
5.
6.
  union all 
select 
  'T' OTYPE, TABSCHEMA OSCHEMA, TABNAME ONAME
, p_btype BTYPE, 'REF:'||reftabschema BSCHEMA, reftabname BNAME
from syscat.references r
where upper(p_btype) in ('T', 'S') and reftabschema=upper(p_bschema) and reftabname=upper(p_bname)
Да, можно добавить анализ по внешним ключам. Но:
1. Достаточно p_btype='T' - на mqt нельзя внешние ключи вешать.
2. Предложение надо добавить в обе части RCTE, причём во второй части надо отсекать возможные ссылки на саму себя, а то бесконечный цикл получится.
Vladimir KiselevДа, мне не очень понравилась конструкция:
Код: plaintext
where btype=upper(p_btype)
поскольку есть типы 'V' и 'v', например.Согласен.
...
Рейтинг: 0 / 0
db2 - граф зависимых объектов
    #35784280
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinVladimir KiselevЕсли я правильно всё понял (проверял не очень хорошо, правда), то для REFERENCES можно добавить в конец A
Код: plaintext
1.
2.
3.
4.
5.
6.
  union all 
select 
  'T' OTYPE, TABSCHEMA OSCHEMA, TABNAME ONAME
, p_btype BTYPE, 'REF:'||reftabschema BSCHEMA, reftabname BNAME
from syscat.references r
where upper(p_btype) in ('T', 'S') and reftabschema=upper(p_bschema) and reftabname=upper(p_bname)
Да, можно добавить анализ по внешним ключам. Но:
1. Достаточно p_btype='T' - на mqt нельзя внешние ключи вешать.
2. Предложение надо добавить в обе части RCTE, причём во второй части надо отсекать возможные ссылки на саму себя, а то бесконечный цикл получится.
Vladimir KiselevДа, мне не очень понравилась конструкция:
Код: plaintext
where btype=upper(p_btype)
поскольку есть типы 'V' и 'v', например.Согласен.

Огромное спасибо,
я протестирую предложенный код.

Такой вопрос - если SQL генерится динамически, то скорее всего ссылки на объекты из этого SQL не будут в системных каталогах. Так ли это? Если да, то как искать - по полю text?
Тоже был такой баг(или фича) - если в теле процедуры есть ссылка на временные таблицы, то были какие-то проблемы с пакаджами.

Я к тому, что насколько надёжно доверять системным каталогам?

Заранее большое спасибо
...
Рейтинг: 0 / 0
db2 - граф зависимых объектов
    #35784794
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KruТакой вопрос - если SQL генерится динамически, то скорее всего ссылки на объекты из этого SQL не будут в системных каталогах. Так ли это?Конечно.
KruЕсли да, то как искать - по полю text?Можно, конечно, но в общем случае - бессмысленно.KruТоже был такой баг(или фича) - если в теле процедуры есть ссылка на временные таблицы, то были какие-то проблемы с пакаджами.

Я к тому, что насколько надёжно доверять системным каталогам?Если вы про то, что если команда содержит временную таблицу, то зависимости для остальных таблиц команды не пишутся в каталог, то это фича.
Доверять системному каталогу можно, но в весьма редких случаях там бывают ошибки, которые должны лечиться и лечатся фиксами.
...
Рейтинг: 0 / 0
db2 - граф зависимых объектов
    #35786267
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк,
огромное спасибо за ответы.

Можно ещё вопрос?

Mark BarinsteinKruТоже был такой баг(или фича) - если в теле процедуры есть ссылка на временные таблицы, то были какие-то проблемы с пакаджами.

Я к тому, что насколько надёжно доверять системным каталогам?Если вы про то, что если команда содержит временную таблицу, то зависимости для остальных таблиц команды не пишутся в каталог, то это фича.
Доверять системному каталогу можно, но в весьма редких случаях там бывают ошибки, которые должны лечиться и лечатся фиксами.
Как отловить, например, таблицы которые использует процедура но для которых зависимости не пишутся - как в случаях выше?

Mark BarinsteinKruЕсли да, то как искать - по полю text?Можно, конечно, но в общем случае - бессмысленно.

Почему бессмысленно искать по полю text?

Есть ли какая-нибудь общепринятая практика решения подобных задач?

Ещё раз огромное спасибо.
...
Рейтинг: 0 / 0
db2 - граф зависимых объектов
    #35786363
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KruКак отловить, например, таблицы которые использует процедура но для которых зависимости не пишутся - как в случаях выше?С помощью event monitor for statements.
KruПочему бессмысленно искать по полю text?Вот вам процедура:
Код: plaintext
1.
2.
3.
create procedure command(stmt varchar( 128 ))
begin
 EXECUTE IMMEDIATE stmt;
end@
Процедура принимает на вход любую команду и выполняет её.
Определите, к каким объектам будет обращаться процедура?
KruЕсть ли какая-нибудь общепринятая практика решения подобных задач?Самим вести такой журнал надо.
...
Рейтинг: 0 / 0
db2 - граф зависимых объектов
    #35786513
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк,
ещё раз огромное спасибо.

Посмотрю что такое event monitor и как им пользоваться.

Насчёт ведения журнала - стараемся :-)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / db2 - граф зависимых объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]