Хранимые процедуры обратного инжиниринга - PullRequest
12 голосов
/ 16 сентября 2008

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

Спасибо!

Ответы [ 8 ]

6 голосов
/ 18 сентября 2008

Более дешевое решение, чем «средство отслеживания зависимостей», - это таблица словаря данных 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 для разработки и тестирования чего-либо.

4 голосов
/ 16 сентября 2008

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

3 голосов
/ 16 сентября 2008

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

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

1 голос
/ 28 октября 2011

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

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

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

1 голос
/ 18 сентября 2008

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

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

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

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

1 голос
/ 17 сентября 2008

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

0 голосов
/ 19 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...