2009-10-28 3 views
0

클라이언트와 코드 검토를하고 있습니다. SQL Server 2008의 proc입니다. 그는 프로세스가 아닌 SQL로 모든 것을 처리하려고합니다. 그는 카탈로그의 목록을 반복하고 각 하나에 시저를 실행 :커서를 사용하여 다른 많은 데이터베이스에서 proc를 호출하는 proc - 악 또는 악취가 나는 경우?

DECLARE CatalogList CURSOR FOR 
SELECT 'EXEC ' + c.CatalogName+ '.dbo.procInEachDb ' 
FROM CatalogList 

FETCH NEXT FROM CatalogList INTO @SQL 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC(@SQL) 
    --PRINT @SQL 
    FETCH NEXT FROM CatalogList INTO @SQL 
END 

내가 일dB에서 교착 상태가 전체 프로세스를 죽일 것이라고 지적했다. 그의 포인트는 5 분마다 실행되는 코드이며 다음 번에 실행된다는 것입니다.

이 코드는 좋지 않지만 특별한 이유는 없습니다. 이것이 문제가되는 것에 대해 잘못된 것인가?

답변

0

정말 procInEachDb의 기능에 달려 있습니다. 로컬 범위 객체에 의존하고 데이터를 조작하고 다른 곳에 데이터를 푸시하기 때문에 독립적으로 실행해야하는 각 데이터베이스에 동일한 코드가있는 유스 케이스를 이해할 수 있습니다. 여러 데이터베이스에서 많은 작업을 수행 할 수는 없습니다 단일 작업에서, 특히 데이터베이스 집합이 동적 인 경우 (틀림없이 정적 집합으로 데이터베이스간에 UNION을 작성할 수 있지만 여전히 쓸 수는 없습니다). 그러나 나는 정말로 절차에서 무엇을하는지, 그리고 왜 이런 방식으로 분해되었는지 클라이언트로부터 이해하려고 노력할 것입니다. 클라이언트가 수행해야 할 작업을 수행하는 가장 좋은 방법 일 수 있으며,이 경우 더 나은 오류 처리를 사용할 수 있다는 것을 제외하고는 전혀 나쁜 냄새가 없습니다. =)

인스턴스에 대해 대략 500 개 이상의 동일한 데이터베이스가있는 시스템 하나를 관리하며 각각에 대해 동일한 일정한 작업 세트를 실행해야합니다. 저는 500 개의 에이전트 작업을 만들고 싶지 않습니다. 그래서 500 단계의 작업을 생성하고 싶지 않습니다. 대신 sp_MSForEachDB와 비슷한 동작을하는 저장 프로 시저를 만들었습니다 (본질적으로 사용자가 보여주는 코드와 동일합니다). 위). 모든 데이터베이스에 대해 실행하고 싶은 많은 명령에이 동일한 절차를 다시 사용합니다. 이 절차는 또한 예외를 허용하는 인수를 취합니다.

예 서비스 브로커와 비슷한 것을 할 수 있었지만, 실제로 어떤 일이 일어나고 있는지에 대한 가시성과 제어력이 더 필요했습니다. 물론 SQL Farms Combine 또는 Red-Gate의 다중 스크립트 도구와 같은 도구를 사용하면 수동 일회성 작업을 쉽게 수행 할 수 있습니다.

관련 문제