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