IT

특정 테이블을 참조하는 모든 저장 프로 시저를 발광하는 방법

lottoking 2020. 7. 25. 10:19
반응형

특정 테이블을 참조하는 모든 저장 프로 시저를 발광하는 방법


테스트 목적으로 개발 환경에 테이블을 만들 예정이 테이블을 추천하는 sp가 거의 없습니다. 이제이 테이블을 삭제 하고이 테이블을 참조하는 모든 sp를 관찰해야합니다. 모든 sp의 목록을 찾기가 어렵습니다. 테이블 이름이 'x'이고 데이터베이스가 SQL Server 2005라고 가정하여 쿼리를 제안하십시오.


SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

BTW- 다음은 바로 유형의 질문에 대한 유용한 리소스입니다 . SQL Server 시스템 카탈로그 쿼리 FAQ


다음은 SQL2008 이상에서 작동합니다. 저장 프로 시저 및 함수 목록을 제공합니다.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name

쿼리가 아닌 방법은 Sql Server Management Studio를 사용하는 것입니다.

마우스 오른쪽 단추로 클릭하고 "종속성보기"를 선택하십시오.

편집하다

그러나 언론인이 말했듯이, 말할 만하지 않습니다.


모든 위의 쿼리는 올바른 결과를 제공하지 않고 다음과 같이 테이블을 얻을 데 사용할 수있는 프로 시저가 있습니다.

EXEC sp_depends @objname = N'TableName';

다음 쿼리는 모든 저장 프로 시저 이름과 해당 SP의 해당 정의를 가져옵니다.

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

이것은 또한 테이블 이름이 주석에 테이블 이름이 사용중인 다른 테이블의 서브 채널 인 SP를 나타냅니다. 예를 들어 이름이 "test"및 "test_2"인 테이블이 "test"를 사용하여 SP를 검색하려고 둘 다에 대한 결과가 표시됩니다.


아래 쿼리는 열에 대한 진술이 아닌 테이블에 대한 검색을 할 때만 작동합니다.

EXEC sp_depends @objname = N'TableName';

그러나 다음 쿼리는 모든 종류의 종속성을 검색하려는 경우 가장 좋은 옵션이며, 어떤 것도 놓치지 않습니다. 실제로 필요한 것보다 더 많은 정보를 제공합니다.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name

Management Studio에서 테이블을 마우스 오른쪽 버튼으로 클릭하고 '종속성보기'를 클릭하면됩니다. 여기에 이미지 설명 입력

테이블과 종속성이있는 객체 목록을 볼 수 있습니다.여기에 이미지 설명 입력


SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

테이블 이름을 언급해야하는 경우 작동합니다.


이 시도

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'

기본적으로 두 가지 옵션이 있습니다.

----옵션 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

---- 옵션 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

이 두 쿼리는 원하는 테이블을 참조하는 모든 저장 프로 시저를 가져옵니다. 이 쿼리는 sysobjects 및 syscomments 인 2 개의 sys 테이블에 의존합니다. sysobjects는 저장 프로 시저를 포함하여 모든 DB 개체 이름이 저장되는 곳입니다.

syscomments에는 모든 절차에 대한 텍스트가 포함되어 있습니다.

쿼리하는 경우 : SELECT * FROM syscomments

마지막 열로 저장 프로 시저에 포함 된 텍스트가있는 sysobjects 테이블에 대한 매핑 인 id가 포함 된 테이블이 있습니다.

참고 URL : https://stackoverflow.com/questions/7272157/how-to-identify-all-stored-procedures-referring-a-particular-table

반응형