SQL Server-Anweisung 'Datenbank erstellen'. Wie erbe ich die Einstellungen für das automatische Wachstum?

9

Ich verwende SQL Server 2008 R2 und erstelle Datenbanken durch kontinuierliche Bereitstellung.

In unserem System funktionieren die Standardeinstellungen für das automatische Wachstum von 1 MB / 10% in SQL Server schlecht mit unseren Daten. Zumal wir eine Legacy-Anwendung haben, die uns daran hindert, das Schema stark zu ändern. Wir möchten, dass die Datenbankeinstellungen auf Instanzebene konfiguriert werden, damit wir sie für bereitgestellte Bereitstellungen ändern können.

Ich habe an mehreren Stellen gelesen, dass die Standardeinstellungen für eine neue Datenbank auf den Einstellungen für 'model' basieren, aber es scheint, dass dies nur durch Klicken auf eine neue Datenbank in der SQL Management Studio-Benutzeroberfläche funktioniert und nicht über ein Skript, z. B. 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

Hat jemand dies tatsächlich dazu gebracht, mit einem Erstellungsskript zu arbeiten? Gibt es eine andere Möglichkeit, das automatische Wachstum pro Serverinstanz festzulegen?

Michelle Steele
quelle
5
Wenn Sie es ausschreiben, CREATE DATABASEwarum können Sie es dann nicht einfach in Ihrem Skript angeben?
JNK
1
@JNK Ich denke, er möchte, dass es erbt, anstatt überprüfen zu müssen, was es sein sollte. Und das sollte es tun, aber ich muss zustimmen, dass es das nicht tut (und das tut es auch 2012 nicht). Ich habe es tatsächlich nicht geglaubt, bis ich es ausprobiert habe - ich bin mir sicher, dass dies irgendwann richtig funktioniert hat. Vielleicht eine Regression von Bugfixes für diese 10000% Sache .
Aaron Bertrand
In diesem Fall sind diese Zahlen irgendwo in einer DMV verfügbar? Könnten Sie es möglicherweise ausschreiben, indem Sie Systemtabellen oder DMVs nach geeigneten Werten abfragen? '
JNK
Zur Verdeutlichung möchten wir lieber erben. Wir haben eine große Anzahl von Datenbankservern mit unterschiedlichem Datenspeicher in unseren bereitgestellten Umgebungen, und die Steuerung von Skriptänderungen pro Umgebung wäre in dieser Phase mehr Arbeit. @ JNKs Idee ist eine, an die ich nicht gedacht hatte. Es sieht so aus, als ob es eine Abfrage geben könnte, die helfen wird: beyondrelational.com/modules/2/blogs/28/posts/10326/…
Michelle Steele

Antworten:

2

Für SQL Server 2005+ können Sie Folgendes verwenden:

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

Dadurch werden Dateidefinitionen für die Modelldatenbank abgerufen.
Später können Sie es entweder in CREATE DATABASE oder ALTER DATABASE verwenden.

SSMS verwendet SMO tatsächlich, um diese Parameter abzurufen, und erstellt dann ein Skript, das wie folgt aussieht:

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

Wenn Ihre Anwendung die Datenbank erstellt und Sie die Anwendung nicht ändern können,
müssen Sie nach Abschluss der Erstellung ALTER DATABASE verwenden:

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

Dies erfordert mindestens die ALTER DATABASE-Berechtigung
(impliziert durch die ALTER ANY DATABASE-
Serverberechtigung). Natürlich können Sie dieses Skript mit dem ersten Codebeispiel (FROM sys.master_files) generieren.

Ich würde Sysaltfiles für SQL Server 2008R2 nicht verwenden, da es veraltet ist.

Viel Glück,
Roi

Roi Gavish
quelle
0

Wie wäre es mit:

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 + '
    ) 
')
JohnLBevan
quelle
ps. Weitere Informationen zu dieser Tabelle finden Sie hier: msdn.microsoft.com/en-us/library/ms181338.aspx . In meinem obigen Code habe ich den Fall maxsize = 0 nicht berücksichtigt (dh kein Wachstum) und den Statuscode maskiert, da ich eine andere Prozentzahl als in der Dokumentation angegeben hatte, aber die Werte über vergleichbar machen konnte Maskierung. Ich mache mir keine Sorgen um den 0-Statuscode, da dies von maxsize erledigt wird (wo es implementiert wurde).
JohnLBevan