Сохраненные процедуры обратного проектирования

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

Спасибо!

Ответ 1

Redgate имеет довольно дорогой продукт под названием SQL Dependency Tracker, который, как представляется, соответствует требованиям.

Ответ 2

Более дешевое решение, чем "отслеживание зависимостей", представляет собой таблицу словарей данных sys.sql_dependencies, из которой эти данные могут быть запрошены из словаря данных. Oracle имеет представление словаря данных с аналогичной функциональностью, называемой DBA_DEPENDENCIES (плюс эквивалентные USER_ и ALL_ views). Используя другие таблицы словарей данных (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. Это можно было бы использовать (например), чтобы определить, какие столбцы были фактически использованы в прогонах 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 для разработки и тестирования чего-либо.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

(Примечание. Я являюсь пользователем TOAD и не получаю от него никакой выгоды)

Ответ 6

Это не очень глубокий или тщательный, но я думаю, что если вы используете 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

Ответ 7

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

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

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

Ответ 8

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