데이터베이스 종속성을 추적하려면 어떻게해야합니까?


37

내부 응용 프로그램이 수년에 걸쳐 발전함에 따라 사람들이 더 이상 관련이 없다고 생각하고 폐기하려는 많은 테이블이있는 경우가 있습니다. SQL 환경과 SSIS와 같은 데이터베이스에서 데이터베이스 종속성을 식별하는 실용적인 방법은 무엇입니까?

나는 다음과 같이 상당히 잔인한 선택을 한 곳에서 일했습니다.

  • 먼저 삭제하고 나중에 질문하십시오 (더 이상 존재하지 않는 테이블을 추출하려고하면 데이터웨어 하우스 빌드가 종료 될 수 있음)
  • 먼저 권한을 제거하고 오류가보고 될 때까지 기다립니다 (실패가 올바르게 처리되지 않으면 자동 버그가 발생할 수 있음)

SQL Server에는 해당 인스턴스 내에서 종속성을 추적하기위한 도구가 포함되어 있지만 다른 인스턴스에 데이터베이스가 있으면 어려움을 겪는 것 같습니다. 종속성을보다 쉽게 ​​쿼리 할 수있는 옵션이 있습니까? "이 열은 어디에 사용됩니까?"와 같은 질문에 대답 할 수 있습니다. "이 저장 프로 시저에서이 다른 서버에서 끝남"또는 "이 SSIS 패키지에서 끝남"과 같은 답변이 있습니까?

답변:


14

이 작업을 수행하는 쉬운 방법은 없습니다. 테이블에서 선택한 것처럼 트리거가 작동하지 않는 것처럼 트리거가 작동하지 않습니다. 내가 찾은 가장 좋은 방법은 개발자가 사용하는 것을 추적하도록하는 것입니다. 무언가를 떨어 뜨릴 때는 모든 개발팀과 확인하고 모든 사람이 사인 오프 한 후 개체 이름을 바꿉니다. 그런 다음 한 달 동안 또는 아무것도 끊어지지 않으면 객체를 안전하게 떨어 뜨릴 수 있습니다.


7
  1. sys.sql_modules.definition과 함께 사용하기위한 검색 코드 : 참조됩니까? 그때...
  2. 권한 확인 : 어떤 클라이언트 코드를 호출 할 수 있습니까? 그때...
  3. 프로파일 러

그러므로:

  • 참조 및 권한이없는 테이블의 경우 사용되지 않습니다.
  • 참조 및 일부 권한이 없으면 프로파일 러를 실행하여 사용법을 확인하십시오.
  • 권한 및 참조가 없으면 사용 로깅을 추가하십시오.

내가 한 일은 테이블을 테이블을 마스킹 한 뷰로 만든 다음 뷰가 제대로 수행되지 않도록하는 것입니다 (크로스 조인 자체, 별개). 실제로 제거하지는 않지만 클라이언트 시간 초과 또는 불만을 생성합니다 ...


6

과거에 사용한 한 가지 빠른 방법은 실제로 테이블 크기, 인덱스 성능 수 등에 따라 다릅니다. 트리거를 추가하여 테이블에서 작업이 수행 될 때 타임 스탬프를 기록합니다. 내가 말했듯이 성능 문제가있을 수 있으므로주의해야합니다. @@ IDENTITY를 사용하는 오래된 코드를 망칠 수 있으므로 로깅 테이블이 ID 필드를 사용하지 않는지 확인하십시오. 물론 응용 프로그램의 기능이 언젠가 사용되지 않았 음을 보여줄 수 있습니다.

데이터베이스에 충돌 할 수있는 모든 코드가 데이터베이스에없는 경우 (예 : 데이터베이스를 쿼리하는 임의의 클라이언트) 종속성을 추적하기가 매우 어렵습니다.

편집 : 테이블에 SELECT 트리거를 가질 수없는 지점을 해결하기 위해 테이블에 인덱스가 있다고 가정하는 다른 옵션이 있습니다 (2008 년에만 테스트).

SELECT          
    last_user_seek,
    last_user_scan,
    last_user_lookup,
    last_user_update
FROM
    sys.dm_db_index_usage_stats AS usage_stats
INNER JOIN
sys.tables AS tables ON tables.object_id = usage_stats.object_id
WHERE
    database_id = DB_ID() AND
    tables.name = 'mytable' 

그러나 사용 통계 테이블은 서버를 다시 시작하거나 분리 할 때 지워집니다. 따라서 데이터를 수집 할 작업을 설정해야합니다. 내가 아는 해킹


4

내가 과거에 사용한 한 가지 방법은 제거 할 테이블의 후보 목록을 설정 한 다음 이름을 바꾸고 실패를 찾는 것입니다.

내가 목록을 설정 한 방법은 다음과 같습니다.

  1. 현재 저장 프로 시저, 트리거 및 함수에서 사용하지 않는 테이블 확인

  2. 빈 테이블 (제로 레코드);

  3. 참조되지 않은 테이블 (관계가없는 테이블);

  4. DB 서버가 시작된 이후 사용되지 않은 테이블 확인 (DMV)

텍스트 파일로 목록을 작성한 후 로컬 매핑 버전 제어 폴더에서 .cs 파일 (.net 프로젝트 만 있음)을 구문 분석하고 해당 테이블이 .cs 파일에서 사용되는지 확인하는 배치 스크립트를 만들었습니다 ( 일어나서는 안되지만, .. 나는 놀랐습니다.) 그렇지 않다면 분명합니다. 그렇다면, 목록을 작성하고 개발자에게 해당 모듈이 여전히 사용 중인지 확인하도록합니다.

즉, 이전 사람들이 옳습니다.은 총알이 없습니다.


3

회사에서 구현하는 정책은 SQL Server에 닿는 모든 것을 소스 제어하에 중앙 위치에 두는 것입니다.

  • asp.net 프로젝트
  • SSRS 프로젝트
  • SSIS 프로젝트
  • 심지어 모든 데이터베이스 객체를 일종의 저장소에 스크립팅했습니다.

아직 설정하지 않았지만 결국 특정 테이블, sproc 등을 검색하는 데 사용할 수있는 일종의 인덱스 / 중앙 검색 메커니즘을 구현하고 싶습니다. 실제로 FoxPro에서 변환하는 새로운 SQL Server Shop입니다. . 따라서 오래된 SQL 객체는 아직 큰 문제가 아니지만 미래를 계획하고 있습니다.

이름 바꾸기 / 추적 접근 방식에서 볼 수있는 문제는 매년 실행되는 것이 아니라 매년 실행되는 것입니다. 사람들이 당신에게 글을 써달라고 요청한 여러 가지 특별한 내용은 말할 것도없고 몇 달 또는 몇 년 후에 다시 묻습니다.


3

다음을 포함하여 종속성 추적에 사용할 다양한 도구와 기술이 있습니다.

내가 아는 도구 :

  • SQL Server 종속성 뷰어 (테이블을 만들기 전에 sp using table을 만든 경우 문제가 발생할 수 있음)
  • Redgate SQL 종속성 추적기 (@Eric Humphrey의 답변을 통해)
  • Resharper (호출 경로를 보는 데 사용할 수있는 .net 도구 , 주요 SQL 호출이 사용되는 위치를 추적하는 데 사용할 수 있다고 생각 합니다)

행동 양식

  • 코드는 SQL 객체 사용을 검색합니다 (위의 일부 도구는 복제 함)
  • 사용 통계 (예 : SQL 객체가 마지막으로 호출 된 시간)를 보면 아래 SQL을 사용합니다.

    SELECT 
        last_execution_time,   
        (SELECT TOP 1 
            SUBSTRING(s2.text,statement_start_offset / 2+1 , 
                ((CASE WHEN statement_end_offset = -1 THEN 
                    (LEN(CONVERT(nvarchar(max),s2.text)) * 2) 
                ELSE statement_end_offset END) - statement_start_offset) / 2+1)
        )  AS sql_statement,
        execution_count
    FROM sys.dm_exec_query_stats AS s1 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
    WHERE 
        s2.text like '%[OBJECT NAME]%' 
        and last_execution_time > [DATE YOU CARE ABOUT]
    ORDER BY last_execution_time desc
    

참고 : 사용 통계 테이블은 서버를 다시 시작하거나 분리 할 때 지워집니다. 따라서 데이터를 수집 할 작업을 설정해야합니다. 내가 아는 해킹 (@Miles D 출신)

기법

  • 마지막 사용 검색 (위의 사용 통계 참조)
  • 사용 장소 검색 (도구 참조)
  • @MrDenny를 통해 개발자와 코드 사용 검토
  • 객체의 이름을 바꾸고 (예 : _toBeDropped를 사용한 post / prefix) 오류를 감시하십시오
  • 권한 변경 및 오류 감시
  • 물건을 떨어 뜨리고기도

2

몇 년 전 비슷한 물건을 검사하는 도구를 만들려고 노력했습니다. TL; DR의 대답은 당시에 사용 가능한 리소스로 할 수 없다는 것입니다.

이 열은 어디에 사용됩니까?

이 질문은 select *열이 상주하는 테이블에서 많은 쿼리, 뷰 및 저장 프로 시저가 사용한다는 것을 알면 더 복잡해집니다 . 그런 다음 해당 결과를 사용하는 프로그램을 살펴 봐야합니다. 따라서 일부 스캐너 / 인덱서 ​​/ 파서가 필요합니다. C #, Delphi, Java, VB, ASP (클래식) 등의 소스 코드를 읽을 수 있으므로 해당 열에 대한 모든 참조를 찾아 내려고합니다. 그런 다음 해당 코드를 더 이상 호출하는지 확인하기 위해 해당 프로그램을 분석해야합니다.



2

이것은 실제로 귀하의 질문에 대한 답변은 아니지만, 언급 해야 할 점은 데이터베이스 외부의 모든 시스템이보기와 sprocs를 통해 통신 해야하는 이유 중 하나 입니다. 검색 가능한 .sql 파일에 빌드 스크립트가 있으므로 특정 테이블이나 열이 외부에서 사용되고 있는지 쉽게 확인할 수 있습니다.

물론 SSIS는 일반적으로 테이블에 직접 연결되므로 지금 당장 필요로하는 데 큰 도움이되지는 않습니다. 그러나 개발자가 데이터베이스에 연결하고 필요한 뷰 및 프로 시저를 만들기 위해 사용자 (또는 DBA로 서비스를 제공하는 사람)를 기다려야한다고 불평 할 때 "테이블이나 열이 삭제되거나 이름이 변경 될 수 있습니다." m보기 및 절차 변경 사항을 계속 알려야합니다. " 또한 이러한 특정 변경 사항에 대한 회귀 테스트 만 수행하면됩니다.


0

TSQL은 sys.dm_sql_referencing_entities 또는 sys.sql_expression_dependencies를 사용할 수 있습니다.

또는 GUI를 사용하여 SQL Negotiator Pro, Redgate 등의 도구가이를 시각적으로 생성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.