![如何更新 SQL Server 中的系统数据库](https://linux22.com/image/651562/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0%20SQL%20Server%20%E4%B8%AD%E7%9A%84%E7%B3%BB%E7%BB%9F%E6%95%B0%E6%8D%AE%E5%BA%93.png)
我在更新 SQL Server 2008 中的系统数据库时遇到了问题。也许有其他方法可以做到这一点,但我基本上需要更改/删除一组数据库的某些日志文件的增长限制。
由于懒惰,我不想使用 SSMS 为 100 个数据库中的每一个手动执行此操作,而是认为我可以创建一个批量查询。
首先,这些信息可以通过视图看到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