SQL Serverの「データベースの作成」ステートメント。自動拡張設定を継承する方法は?


9

SQL Server 2008 R2を使用しており、継続的な展開を通じてデータベースを作成しています。

私たちのシステムでは、SQL Serverのデフォルトの1Mb / 10%自動拡張設定は、データを適切に処理しません。特に、スキーマをあまり変更できないレガシーアプリケーションがあるためです。データベースの設定をインスタンスレベルで構成して、段階的な展開で変更できるようにします。

新しいデータベースのデフォルト設定が「モデル」の設定に基づいていることをいくつか読んだことがありますが、これはSQL Management Studio UIで新しいデータベースをクリックすることによってのみ機能し、スクリプト、たとえばCREATE DATABASE [MyDb]からは機能しないようです。

msdn.microsoft.com/en-us/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に適切な値をクエリすることで、スクリプトを作成できますか?」
JNK 2012

明確にするために、私たちはむしろ継承したいと思います。ステージングされた環境全体でさまざまなデータストレージを持つ多数のdbサーバーがあり、環境ごとにスクリプトの変更を制御することは、この段階ではより多くの作業になります。@JNKの考えは私が考えもしなかったものです。役立つクエリがあるようです: beyondrelational.com/modules/2/blogs/28/posts/10326/…–
ミシェルスティール

回答:


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サーバー権限によって暗示されます)
明らかに、最初のコードサンプル(FROM sys.master_files)を使用してそのスクリプトを生成できます。

SQL Server 2008R2は非推奨であるため、sysaltfilesを使用しません。

幸運、
ロイ


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.