문제

우리는 직장에서 수많은 레거시 저장 프로시저로 인해 문제를 겪고 있습니다.해당 절차를 더 잘 이해하는 데 도움이 될 수 있는 도구를 추천해 주실 수 있나요?프로시저 간 종속성 및/또는 프로시저와 프로시저 간의 종속성을 식별하는 일종의 리버스 엔지니어링입니다.테이블 종속성.무료 또는 상업용 도구일 수 있습니다.

감사해요!

도움이 되었습니까?

해결책

Redgate에는 다음과 같은 다소 비싼 제품이 있습니다. SQL 종속성 추적기 요건을 충족하는 것 같습니다.

다른 팁

'종속성 추적기'보다 저렴한 솔루션은 데이터 사전에서 이 데이터를 쿼리할 수 있는 데이터 사전 테이블 sys.sql_dependent입니다.Oracle에는 DBA_DEPENDENCIES(동등한 USER_ 및 ALL_ 뷰 포함)라는 유사한 기능을 갖춘 데이터 사전 뷰가 있습니다.다른 데이터 사전 테이블(sys.tables/DBA_TABLES) 등을 사용합니다.개체 종속성 보고서를 생성할 수 있습니다.

특히 관심이 있다면 재귀 쿼리(Oracle CONNECT BY 또는 SQL Server 공통 테이블 표현식)를 사용하여 완전한 개체 종속성 그래프를 작성할 수 있습니다.

다음은 sys.sql_dependent에 대한 재귀 CTE의 예입니다.깊이와 함께 모든 종속성에 대한 항목을 반환합니다.항목은 모든 종속 관계에 대해 여러 깊이에서 두 번 이상 발생할 수 있습니다.DBA_DEPENDENCIES에 대한 CONNECT BY 쿼리를 작성하기 위해 작동하는 Oracle 인스턴스가 없으므로 편집 권한과 시간 및 전문 지식이 있는 사람이라면 누구나 이 답변에 주석을 달거나 편집할 수 있습니다.

함께 참고하세요 sys.sql_dependencies 열 참조를 얻을 수 있습니다 referenced_minor_id.예를 들어 이는 실제로 사용되는 열보다 더 많은 열이 있는 원본의 DB 테이블 복사본이 있는 준비 영역의 ETL sproc에서 실제로 사용된 열을 확인하는 데 사용될 수 있습니다.

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 인스턴스가 없습니다.

내 생각 엔 rpetrich가 언급한 Red Gate 종속성 추적기 괜찮은 솔루션이고 잘 작동하며 Red Gate에는 30일 평가판이 있습니다(이상적으로는 법의학을 수행하기에 충분한 기간).

또한 시스템을 분리하고 테이블에 대한 모든 SQL 작업을 표시하는 SQL 프로파일러.이것은 종종 시퀀스 다이어그램을 작성하기 위한 좋은 출발점 또는 이러한 코드를 문서화하기로 선택한 방법.행운을 빌어요!

Redgate SQL 문서.생성된 문서에는 상호 참조된 종속성 정보가 포함되어 있습니다.예를 들어 각 테이블에 대해 해당 테이블을 참조하는 뷰, 저장 프로시저, 트리거 등이 나열됩니다.

저장 프로시저는 어떤 데이터베이스에 있나요?오라클, SQL Server, 다른 것?

의견을 바탕으로 편집: Oracle을 사용하고 있다면 다음을 살펴보십시오. 두꺼비.저는 데이터베이스 내의 PL/SQL 상호 종속성을 그래픽으로 표시할 수 있는 Code Roadmap이라는 기능을 사용합니다.런타임 호출 스택 종속성을 표시하는 코드 전용 모드 또는 코드에 의해 접촉되는 데이터베이스 개체(테이블, 뷰, 트리거)도 표시하는 코드 플러스 데이터 모드에서 실행할 수 있습니다.

(참고 - 저는 TOAD 사용자이므로 추천해도 아무런 혜택을 얻지 못합니다.)

이것은 실제로 깊거나 철저하지는 않지만 MS SQL Server 또는 Oracle을 사용하는 경우(아마도 Nigel이 PL-SQL 샘플에 도움을 줄 수 있음)...Nigel이 뭔가를 하고 있다고 생각합니다.이는 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

데이터베이스 개체의 종속성 체인을 찾는 방법 Jacob Sebastian의 MS SQL Server 2000 (?)+)

새 보고서를 배포하거나 기존 보고서를 수정해야 할 때마다 주어진 보고서 저장 프로 시저에 의존하는 데이터베이스 개체가 무엇인지 알아야합니다.때로는 보고서가 매우 복잡하고 저장된 각 절차에는 수십 개의 종속 객체가있을 수 있으며 각 종속 객체는 다른 수십 개의 객체에 따라있을 수 있습니다.

그는 주어진 저장된 절차의 객체에 따라 모든 것을 재귀 적으로 찾는 방법이 필요했습니다.이를 달성하기 위해 CTE를 사용하여 재귀 쿼리를 썼습니다.

리버스 엔지니어링을 위한 최고의 단일 도구는 APEX입니다.놀랍다..NET 어셈블리를 추적하여 프로세스가 사용되는 위치를 알려줄 수도 있습니다.동종 제품 중 가장 깊은 제품입니다.RedGate에는 다른 훌륭한 도구도 있지만 이 경우에는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top