【问题标题】:How can I disable autogrowth in SQL Server wide如何在 SQL Server 范围内禁用自动增长
【发布时间】:2017-12-20 10:58:43
【问题描述】:

我有一个数据库服务器,其中一些用户受限的数据库正在数据库中使用。我需要限制用户不能更改 .MDF.LDF 自动增长设置。请指导我限制用户。

我认为有两种方法可以获得此访问权限:

  1. 禁用数据库中的自动增长
  2. 限制 MDF 和 LDF 的最大尺寸

但我在 Management Studio 中找不到任何选项可以在服务器范围内执行它们并获得用户的访问权限。

谢谢。

【问题讨论】:

    标签: sql-server ssms


    【解决方案1】:

    您可以执行下面的ALTER DATABASE command,它将所有使用未记录的stored procedure sp_Msforeachdb 的数据库的自动增长选项设置为关闭

    对于单个数据库(仅限并行数据仓库实例)

    ALTER DATABASE [database_name] SET AUTOGROW = OFF
    

    适用于所有数据库

    EXEC sp_Msforeachdb "ALTER DATABASE [?] SET AUTOGROW = OFF"
    

    虽然这不是服务器变量或实例设置,但它可以帮助您简化更新 SQL Server 实例上所有数据库的任务

    通过排除系统数据库和所有其他数据库,可以执行以下T-SQL来获取所有数据库文件的列表并可以执行准备好的输出命令

    select 
        'ALTER DATABASE [' + db_name(database_id) + '] MODIFY FILE ( NAME = N''' + name + ''', FILEGROWTH = 0)'
    from sys.master_files
    where database_id > 4
    

    为了防止更改数据文件的自动增长属性,我在使用 DDL 触发器记录 DROP 表语句时准备了下面的SQL Server DDL trigger。 跟随触发器也会阻止您更改此属性,因此如果您需要更新此属性,则必须先删除此触发器。

    CREATE TRIGGER prevent_filegrowth
    ON ALL SERVER
    FOR ALTER_DATABASE
    AS   
    
    declare @SqlCommand nvarchar(max)
    set @SqlCommand = ( SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') );
    
    
    if( isnull(charindex('FILEGROWTH', @SqlCommand), 0) > 0 )
    begin
        RAISERROR ('FILEGROWTH property cannot be altered', 16, 1)   
        ROLLBACK  
    end
    GO
    

    有关 DDL 触发器的更多信息,请参阅Microsoft Docs

    【讨论】:

    • 感谢您的快速回复。但是当我这样做时,用户可以编辑他们自己的数据库。是否有任何选项可以限制用户避免访问此选项?
    • 感谢您的反馈 masoud,我添加了一个 DDL 触发器,它可以防止更新任何数据库的 AutoGrow 属性。也许它可以帮助你。您可以根据您的要求添加其他过滤器以排除 master 或 tempdb 等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2016-06-16
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多