Я работаю над улучшением моего понимания некоторых системных проблем, и меня очень смущает этот скрипт, над которым я работал. Чтобы понять мое понимание 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
«петля» не работает должным образом? Чего мне не хватает?