Назад | Перейти на главную страницу

Как обновить системные базы данных в 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'".

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

Чтобы обновить 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