Более дешевое решение, чем «средство отслеживания зависимостей», - это таблица словаря данных sys.sql_dependencies, из которой эти данные можно запрашивать из словаря данных. Oracle имеет представление словаря данных с аналогичной функциональностью, которая называется DBA_DEPENDENCIES (плюс эквивалентные представления USER_ и ALL_). Используя другие таблицы словаря данных (sys.tables / DBA_TABLES) и т. Д., Вы можете создавать отчеты об объектных зависимостях.
Если вы чувствуете особую заинтересованность, вы можете использовать рекурсивный запрос (Oracle CONNECT BY или выражения SQL Server Common Table) для построения полного графа зависимостей объектов.
Вот пример рекурсивного CTE для sys.sql_dependencies. Он вернет запись для каждой зависимости с ее глубиной. Элементы могут встречаться более одного раза, возможно, на разной глубине для каждого отношения зависимости. У меня нет работающего экземпляра Oracle для составления запроса CONNECT BY на DBA_DEPENDENCIES, поэтому любой, кто имеет права на редактирование, имеет время и опыт, может комментировать или редактировать этот ответ.
Обратите внимание, также с sys.sql_dependencies
, что вы можете получить ссылки на столбцы из referenced_minor_id
. Это можно использовать (например), чтобы определить, какие столбцы фактически использовались в sprocs ETL из промежуточной области с копиями таблиц БД из источника с большим количеством столбцов, чем фактически используется.
with dep_cte as (
select o2.object_id as parent_id
,o2.name as parent_name
,o1.object_id as child_id
,o1.name as child_name
,d.referenced_minor_id
,1 as hierarchy_level
from sys.sql_dependencies d
join sys.objects o1
on o1.object_id = d.referenced_major_id
join sys.objects o2
on o2.object_id = d.object_id
where d.referenced_minor_id in (0,1)
and not exists
(select 1
from sys.sql_dependencies d2
where d2.referenced_major_id = d.object_id)
union all
select o2.object_id as parent_id
,o2.name as parent_name
,o1.object_id as child_id
,o1.name as child_name
,d.referenced_minor_id
,d2.hierarchy_level + 1 as hierarchy_level
from sys.sql_dependencies d
join sys.objects o1
on o1.object_id = d.referenced_major_id
join sys.objects o2
on o2.object_id = d.object_id
join dep_cte d2
on d.object_id = d2.child_id
where d.referenced_minor_id in (0,1)
)
select *
from dep_cte
order by hierarchy_level
Теперь у меня есть возможность открыть это для сообщества. Может ли кто-нибудь с удобным доступом к работающему экземпляру Oracle опубликовать здесь рекурсивный запрос CONNECT BY? Обратите внимание, что это зависит от SQL-сервера, и с тех пор владелец вопроса дал понять, что он использует Oracle. У меня нет работающего экземпляра Oracle для разработки и тестирования чего-либо.