3

일부 시스템 sprocs에 대한 이해를 높이기 위해 노력하고 있으며이 스크립트로 인해 매우 혼란 스럽습니다. sp_MSForEachDB을 이해하기 위해 서버의 모든 데이터베이스 로그를 자르는 스크립트를 작성하기로했습니다. 따라서 다음 스크립트를 생각해 냈습니다.예기치 않은 sp_MSForEachDB 동작

sp_MSForEachDb 'IF LOWER(rtrim(''?'')) NOT IN ('''', ''master'', ''tempdb'', ''tempdev'', ''model'', ''msdb'') 
       BEGIN 
        declare @LogFile nvarchar(max) 
        USE [?] 
        SELECT @LogFile = sys.sysaltfiles.name FROM sys.sysdatabases 
        INNER JOIN sys.sysaltfiles ON sys.sysdatabases.dbid = sys.sysaltfiles.dbid 
        WHERE (sys.sysaltfiles.fileid = 1) AND (sys.sysdatabases.name = ''?'') 
        print ''DB: [?], Log: '' + @LogFile 
        CHECKPOINT 
        DBCC SHRINKFILE (@LogFile, 1) 
       END' 

때로는 데이터베이스의 로그를 잘 자르는 경우가 있습니다. 데이터베이스에서 오류가 발생하지 않고 오류 메시지가 나타나지 만 로그 파일은 일관되게/재생 불가능하게 실패합니다.

그러나 print 문에서는 정확히 인쇄 할 것으로 예상되는 내용을 인쇄합니다. 그러나 각 데이터베이스에 대해이 스크립트의 기능적 부분을 수동으로 입력하면 :

USE [Seed] 
CHECKPOINT 
DBCC SHRINKFILE('Seedlog', 1) 

시간은 100 % 작동합니다.

sp_MSForEachDB "루프"가 예상대로 작동하지 않는 이유는 무엇입니까? 내가 뭘 놓치고 있니?

답변

2

쿼리가 로그 파일이 아닌 데이터 파일의 논리 이름을 반환하는 것처럼 보입니까? (fileID = 1)

+0

와우, 꽤 감독. 좋은 캐치! 눈을 가져 주셔서 감사합니다. :) – Jaxidian

관련 문제