SQL Server“创建数据库”语句。如何继承自动增长设置?


9

我正在使用SQL Server 2008 R2,并通过连续部署来创建数据库。

在我们的系统中,SQL Server中的默认1Mb / 10%自动增长设置无法很好地处理我们的数据。特别是因为我们有一个遗留应用程序,使我们无法太多更改架构。我们希望在实例级别配置数据库设置,以便我们可以针对分阶段部署进行更改。

我已经在几个地方阅读过,新数据库的默认设置基于'model'的设置,但是看来这只能通过单击SQL Management Studio UI中的新数据库来实现,而不是通过脚本(例如CREATE DATABASE [MyDb])来实现。

msdn.microsoft.com/zh-CN/library/ms186388(v=sql.105).aspx

sqlservercentral.com/Forums/Topic1065073-391-1.aspx

/programming/8828557/possible-to-configure-database-autogrowth-settings-at-the-instance-level/8828604#comment15586568_8828604

有人真的可以使用它来创建脚本吗?还有其他方法可以为每个服务器实例设置自动增长吗?


5
如果要编写脚本,CREATE DATABASE为什么不只在脚本中指定呢?
JNK 2012年

1
@JNK我认为他希望它继承而不是必须检查它应该是什么。它应该做到这一点,但我必须同意它没有这样做(并且在2012年也没有这样做)。在尝试之前,我实际上并不相信-我确信这在某些时候是正确的。也许是从10000%的错误修复程序中得出的结论
亚伦·伯特兰

在那种情况下,那些数字在DMV中可用吗?您可以通过查询系统表或DMV以获取适当的值来编写脚本吗?
2012年

为了澄清,我们宁愿继承。我们拥有大量的数据库服务器,这些数据库服务器在暂存环境中的数据存储各不相同,因此,在此阶段控制每个环境的脚本更改将更加繁琐。@JNK的想法是我从未想到的。看来可能会有一个查询会有所帮助: beyondrelational.com/modules/2/blogs/28/posts/10326/…–
米歇尔·斯蒂尔

Answers:


2

对于SQL Server 2005+,可以使用以下命令:

SELECT FILE_ID, type, type_desc, 
CAST( CAST( (CASE WHEN size < 128 THEN 128 ELSE size END) * 8. / 1024. AS INT ) AS VARCHAR(20) ) + 'MB' AS SIZE, 
CASE max_size WHEN -1 THEN 'UNLIMITED' ELSE CAST( CAST( max_size * 8. / 1024. AS INT ) AS VARCHAR(20) ) + 'MB' END  AS MAXSIZE,
CASE is_percent_growth
    WHEN 0 THEN CAST( CAST( growth * 8. / 1024. AS INT ) AS VARCHAR(20) ) + 'MB'
    WHEN 1 THEN CAST( growth AS VARCHAR(30) ) + '%'
END AS FILEGROWTH
FROM sys.master_files
WHERE database_id = DB_ID('model')
GO

这将检索模型数据库的文件定义。
以后,您可以在CREATE DATABASE或ALTER DATABASE中使用它。

SSMS实际上使用SMO来检索这些参数,然后创建一个类似于以下内容的脚本:

CREATE DATABASE [aaa] ON  PRIMARY 
( NAME = N'aaa', FILENAME = N'D:\Data\aaa.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED , FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'aaa_log', FILENAME = N'D:\Logs\aaa_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO

如果您的应用程序正在创建数据库,而您不能修改该应用程序-
那么创建完成后,您必须使用ALTER DATABASE:

ALTER DATABASE [aaa] MODIFY FILE ( NAME = N'aaa', MAXSIZE = 102400KB )
GO
ALTER DATABASE [aaa] MODIFY FILE ( NAME = N'aaa_log', FILEGROWTH = 10240KB )
GO

这至少需要ALTER DATABASE权限
(由ALTER ANY DATABASE Server权限表示)。
显然,您可以使用第一个代码示例(FROM sys.master_files)生成该脚本。

我不会为SQL Server 2008R2使用sysaltfile,因为它已弃用。

祝你好运,
投资回报率


0

怎么样:

use master
go

declare @newDbName sysname
, @fn nvarchar(1024)
, @growthAmount integer
, @growth nvarchar(128)
, @growthAmount_log integer
, @growth_log nvarchar(128)

set @newDbName = 'myNewDB'

--see what's available to us
--select * 
--from sys.sysaltfiles saf
--inner join sys.databases db
--  on saf.dbid = db.database_id
--where db.name = 'model'

select @growthAmount = saf.growth 
, @growth = case saf.status & 0x100000 when 0 then 'MB' else '%' end
, @fn = replace(saf.filename,'model.mdf','')
from sys.sysaltfiles saf
inner join sys.databases db
    on saf.dbid = db.database_id
where db.name = 'model'
and saf.name = 'modeldev'

select @growthAmount_log = saf.growth 
, @growth_log = case saf.status & 0x100000 when 0 then 'MB' else '%' end
from sys.sysaltfiles saf
inner join sys.databases db
    on saf.dbid = db.database_id
where db.name = 'model'
and saf.name = 'modellog'

if @growth = 'MB' set @growthAmount = @growthAmount / 128
if @growth_log = 'MB' set @growthAmount_log = @growthAmount_log / 128

set @growth = cast(@growthAmount as nvarchar(10)) + @growth
set @growth_log = cast(@growthAmount_log as nvarchar(10)) + @growth_log

print '
    CREATE DATABASE ' + @newDbName + '
    ON 
    (   
        NAME = ' + @newDbName + '_data
        ,FILENAME = ''' + @fn + @newDbName + '.mdf''
        ,FILEGROWTH = ' + @growth + '
    )
    LOG ON
    ( 
        NAME = ' + @newDbName + '_log
        ,FILENAME = ''' + @fn + @newDbName + '.ldf''
        ,FILEGROWTH = ' + @growth_log + '
    ) 
'
exec('
    CREATE DATABASE ' + @newDbName + '
    ON 
    (   
        NAME = ' + @newDbName + '_data
        ,FILENAME = ''' + @fn + @newDbName + '.mdf''
        ,FILEGROWTH = ' + @growth + '
    )
    LOG ON
    ( 
        NAME = ' + @newDbName + '_log
        ,FILENAME = ''' + @fn + @newDbName + '.ldf''
        ,FILEGROWTH = ' + @growth_log + '
    ) 
')

ps。有关此表的更多信息,请访问:msdn.microsoft.com/en-us/library/ms181338.aspx。在上面的代码中,我没有考虑maxsize = 0的情况(即没有增长),并且掩盖了状态代码,因为我有与文档中百分比不同的数字,但是能够通过掩蔽。我不担心状态码为0,因为这是由maxsize处理的(已实现)。
JohnLBevan 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.