代码之家  ›  专栏  ›  技术社区  ›  Nostromo

MS-SQL:常规更改数据库的FileGrowth参数

  •  1
  • Nostromo  · 技术社区  · 7 年前

    现在我需要更新我们使用的数据库,并将所有数据库的所有文件的FileGrowth参数设置为某个值。

    我知道如何从查询中获取当前数据库文件的逻辑文件名:

    SELECT file_id, name as [logical_file_name], physical_name FROM sys.database_files
    

    知道逻辑文件名后,我知道如何设置所需的FileGrowth值:

    ALTER DATABASE MyDB MODIFY FILE (Name='<logical file name>', FileGrowth=10%)
    

    但我不知道如何将这些步骤组合成一个脚本。

    对于更新过程(现在),我们只可能获得数据库连接并在此连接上执行sql脚本,因此如果可能的话,最好使用“纯”脚本解决方案。

    1 回复  |  直到 7 年前
        1
  •  1
  •   EzLo tumao kaixin    7 年前

    以下脚本接收数据库名称作为参数,并使用2个动态SQL:一个用于游标循环所选数据库的数据库文件,另一个用于应用正确的 ALTER TABLE MODIFY FILE .

    这个 EXEC 在这两种情况下都有评论,并且有 PRINT 相反,这样您可以在执行之前进行检查。我刚刚在我的沙箱上测试了它,它按预期工作。

    DECLARE @DatabaseName VARCHAR(100) = 'DBName'
    
    DECLARE @DynamicSQLCursor VARCHAR(MAX) = '
    
        USE ' + @DatabaseName + ';
    
        DECLARE @FileName VARCHAR(100)
    
        DECLARE FileCursor CURSOR FOR
            SELECT S.name FROM sys.database_files AS S
    
        OPEN FileCursor
        FETCH NEXT FROM FileCursor INTO @FileName
    
        WHILE @@FETCH_STATUS = 0
        BEGIN
    
            DECLARE @DynamicSQLAlterDatabase VARCHAR(MAX) = ''
                ALTER DATABASE ' + @DatabaseName + ' MODIFY FILE (Name = '''''' + @FileName + '''''', FileGrowth = 10%)''
    
            -- EXEC (@DynamicSQLAlterDatabase)
            PRINT (@DynamicSQLAlterDatabase)
    
            FETCH NEXT FROM FileCursor INTO @FileName
    
        END
    
        CLOSE FileCursor
        DEALLOCATE FileCursor '
    
    
    -- EXEC (@DynamicSQLCursor)
    PRINT (@DynamicSQLCursor)
    

    您可能需要检查常见的动态SQL警告,例如确保连接的值不会破坏SQL,并添加错误处理。

    至于如何将其应用于多个数据库,您可以创建一个SP并执行几次,或者将一个数据库名称cursor/while循环包装到该SP上。