Вопрос

У нас возникла проблема с огромным количеством устаревших хранимых процедур в процессе работы.Ребята, порекомендуете ли вы какой-нибудь инструмент, который поможет лучше понять эти процедуры?Какой-то обратный инжиниринг, который идентифицирует межпроцедурные зависимости и / или сравнение процедурзависимости таблиц.Может быть бесплатным или коммерческим инструментом.

Спасибо!

Это было полезно?

Решение

У Redgate есть довольно дорогой продукт под названием Средство отслеживания зависимостей SQL это, по-видимому, соответствует требованиям.

Другие советы

Более дешевым решением, чем "отслеживание зависимостей", является таблица словаря данных sys.sql_dependencies, из которой эти данные могут быть запрошены из словаря данных.Oracle имеет представление словаря данных с аналогичной функциональностью , называемое DBA_DEPENDENCIES (плюс эквивалентные представления USER_ и ALL_) .Используя другие таблицы словаря данных (sys.tables/DBA_TABLES) и т.д.вы можете создавать отчеты о зависимостях объектов.

Если вам это особенно интересно, вы можете использовать рекурсивный запрос (Oracle CONNECT BY или SQL Server Common Table Expressions) для построения полного графика зависимостей объекта.

Вот пример рекурсивного 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 recursive?Обратите внимание, что это специфично для SQL-сервера, и с тех пор владелец вопроса дал понять, что он использует Oracle.У меня нет под рукой работающего экземпляра Oracle для разработки и тестирования чего-либо.

Я думаю, что Red Gate Dependency Tracker, упомянутый rpetrich это достойное решение, оно хорошо работает, и у Red Gate есть 30-дневная пробная версия (в идеале достаточно продолжительная, чтобы вы могли провести судебную экспертизу).

Я бы также рассмотрел возможность изоляции системы и запуска SQL Profiler, который покажет вам все действия SQL над таблицами.Это часто является хорошая отправная точка для построения диаграммы последовательности или как бы вы ни документировали эти коды.Удачи вам!

Redgate SQL Doc.сгенерированная документация включала информацию о зависимостях с перекрестными ссылками.Например, для каждой таблицы в нем перечислены представления, хранимые процедуры, триггеры и т.д., которые ссылаются на эту таблицу.

В какой базе данных хранятся процедуры?Oracle, SQL Server, что-то еще?

Редактировать на основе комментария: Учитывая, что вы используете Oracle, взгляните на ЖАБА.Я использую в нем функцию под названием Code Roadmap, которая позволяет графически отображать взаимозависимости PL / SQL внутри базы данных.Он может работать в режиме "Только код", показывая зависимости от стека вызовов во время выполнения, или в режиме "Код плюс данные", где он также показывает вам объекты базы данных (таблицы, представления, триггеры), к которым прикасается ваш код.

(Примечание - я являюсь пользователем TOAD и не получаю никакой пользы от обращения к нему)

Это не очень глубоко или досконально, но я думаю, что если вы используете MS SQL Server или Oracle (возможно, Найджел сможет помочь с образцом PL-SQL)...Найджел кое-что придумал .Это касается только 3 зависимостей в глубину, но может быть изменено так, чтобы оно было настолько глубоким, насколько вам нужно.Это не самая красивая вещь...но она функциональна...

select 
    so.name + case when so.xtype='P' then ' (Stored Proc)' when so.xtype='U' then ' (Table)' when so.xtype='V' then ' (View)' else ' (Unknown)' end as EntityName, 
    so2.name + case when so2.xtype='P' then ' (Stored Proc)' when so2.xtype='U' then ' (Table)' when so2.xtype='V' then ' (View)' else ' (Unknown)' end as FirstDependancy,
    so3.name + case when so3.xtype='P' then ' (Stored Proc)' when so3.xtype='U' then ' (Table)' when so3.xtype='V' then ' (View)' else ' (Unknown)' end as SecondDependancy,
    so4.name + case when so4.xtype='P' then ' (Stored Proc)' when so4.xtype='U' then ' (Table)' when so4.xtype='V' then ' (View)' else ' (Unknown)' end as ThirdDependancy
from 
  sysdepends sd 
    inner join sysobjects as so on sd.id=so.id 
    left join sysobjects as so2 on sd.depid=so2.id
    left join sysdepends as sd2 on so2.id=sd2.id and so2.xtype not in ('S','PK','D')
    left join sysobjects as so3 on sd2.depid=so3.id and so3.xtype not in ('S','PK','D')
    left join sysdepends as sd3 on so3.id=sd3.id and so3.xtype not in ('S','PK','D')
    left join sysobjects as so4 on sd3.depid=so4.id and so4.xtype not in ('S','PK','D')
where so.xtype = 'P' and left(so.name,2)<>'dt'
group by so.name, so2.name, so3.name, so4.name, so.xtype, so2.xtype, so3.xtype, so4.xtype

Как найти цепочку зависимостей объекта базы данных (MS SQL Server 2000 (?)+) автор: Джейкоб Себастьян

Каждый раз, когда ему нужно развернуть новый отчет или изменить существующий отчет, ему необходимо знать, какие объекты базы данных зависят от данной хранимой процедуры отчета.Иногда отчеты бывают очень сложными и каждая хранимая процедура может иметь десятки зависимых объектов, и каждый зависимый объект может зависеть от других десятков объектов.

Ему нужен был способ рекурсивного поиска всех зависимых объектов данной хранимой процедуры.Я написал рекурсивный запрос с использованием CTE для достижения этого.

Единственным лучшим инструментом для реверс-инжиниринга является APEX.Это потрясающе.Он может даже отслеживать сборки .NET и сообщать вам, где используются процедуры.Это, безусловно, самый глубокий продукт в своем роде.У RedGate есть отличные другие инструменты, но не в данном случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top