У меня проблемы с обновлением системной базы данных в 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