문제

약 100 개의 테이블과 약 250 개의 저장 절차가있는 거대한 데이터베이스가 있습니다. 저장된 절차의 하위 집합의 영향을받는 테이블 목록을 알고 싶습니다. 예를 들어, 250 명 중 50 개의 저장된 절차 목록이 있으며이 50 개의 저장된 절차의 영향을받을 테이블 목록을 알고 싶습니다. 저장된 모든 절차를 읽고 수동으로 테이블 목록을 찾는 것 외에이 작업을 수행하는 쉬운 방법이 있습니까?

추신 :이를 위해 SQL Server 2000 및 SQL Server 2005 클라이언트를 사용하고 있습니다.

도움이 되었습니까?

해결책

이것은 SQL 서버 쿼리입니다.

SELECT
    [NAME]
FROM
    sysobjects
WHERE
    xType = 'U' AND --specifies a user table object
    id in
    (
        SELECT 
            sd.depid 
        FROM 
            sysobjects so,
            sysdepends sd
        WHERE
            so.name = 'NameOfStoredProcedure' AND 
            sd.id = so.id
    )

이것이 누군가를 돕기를 바랍니다.

다른 팁

sp_ddependes 'StoredProcName' 저장된 Proc가 의존하는 객체 이름과 객체 유형을 반환합니다.

편집하다: 나는 @kg의 대답을 더 좋아합니다. 더 유연한 IMHO.

나는 SQL 2005에서 이런 식으로 할 것입니다 (무례한 "및"특정 Proc에 대해서만 원한다면 라인) :

SELECT 
    [Proc] = SCHEMA_NAME(p.schema_id) + '.' + p.name,
    [Table] = SCHEMA_NAME(t.schema_id) + '.' + t.name,
    [Column] = c.name,
    d.is_selected,
    d.is_updated
FROM sys.procedures p
    INNER JOIN  sys.sql_dependencies d
        ON  d.object_id = p.object_id
        AND d.class IN (0,1)
    INNER JOIN  sys.tables t
        ON  t.object_id = d.referenced_major_id
    INNER JOIN  sys.columns c
        ON  c.object_id = t.object_id
        AND c.column_id = d.referenced_minor_id
WHERE   p.type IN ('P')
--  AND p.object_id = OBJECT_ID('MyProc')
ORDER BY 
    1, 2, 3

매우 침습적 인 옵션 중 하나는 중복 데이터베이스를 가져 와서 무언가가 발생한 로그를 기록한 모든 테이블에 트리거를 설정하는 것입니다. 그런 다음 모든 SP를 실행하십시오. 작동하지 않는 DB에 많은 개조를 할 수 없다면

또한 트리거를 통해 SP의 영향을받는 테이블을 원한다면 로깅을 로깅으로 바꾸지 않고 기존 트리거에 로깅을 추가하십시오.

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