Как обновить системные базы данных в SQL Server

У меня возникают проблемы с обновлением системной базы данных в SQL Server 2008. Возможно, есть другой способ сделать это, но мне нужно изменить / удалить ограничения роста определенных файлов журналов для нескольких баз данных.

Будучи ленивым, вместо того, чтобы делать это вручную для каждой из 100 баз данных, использующих SSMS, я подумал, что могу создать пакетный запрос.

Во-первых, эта информация видна через sys.master_files Посмотреть:

select database_id, name, max_size 
from sys.master_files

И по этой ссылке ("Как обновить системные таблицы в SQL 2008 R2") я обнаружил, что соответствующая база данных для этого представления на самом деле sys.sysbrickfiles:

План выполнения показывает фактические базы данных

Но даже после соединения с sqlcmd и используя sp_configure 'allow updates', 1, запрашивая sys.sysbrickfiles возвращается "Invalid object name 'sys.sysbrickfiles'",

Что мне здесь не хватает?

1 ответ

Решение

Чтобы обновить sys.brickfiles вручную, вам необходимо использовать выделенное соединение администратора. Это доступно через SQLCMD; вам просто нужно напечатать ADMIN: перед именем сервера.

[Вставьте общее предупреждение о том, чтобы быть осторожным и иметь резервные копии здесь.]

И наоборот, вы можете перебрать список баз данных и изменить параметры автоматического роста таким образом (быстрое набрасывание, основанное на том, что я лежал без дела; вам, вероятно, придется изменить его):

declare @SQL nvarchar(max)
        @RowsToProcess int,
        @CurrentRow int = 0,
        @dbname nvarchar(80)

CREATE TABLE #dblist(RowID int not null identity(1,1), dbname nvarchar(50) )  
INSERT into #dblist (dbname) SELECT name FROM sys.databases where name not in ('master','msdb','model','tempdb')

SET @RowsToProcess=@@ROWCOUNT


WHILE @CurrentRow<@RowsToProcess
BEGIN
    SET @CurrentRow=@CurrentRow+1
    SELECT 
        @dbname=dbname FROM #dblist WHERE RowID=@CurrentRow
        set @SQL='ALTER DATABASE [' + @DBName + ']  MODIFY FILE (NAME=N''' + @DBName + '_Log'', FILEGROWTH=20MB);'
        print @SQL
        EXEC SP_EXECUTESQL @SQL             
END


drop table #dblist
Другие вопросы по тегам