Instrukcja „Utwórz bazę danych” programu SQL Server. Jak dziedziczyć ustawienia autogrowth?

9

Korzystam z programu SQL Server 2008 R2 i tworzę bazy danych poprzez ciągłe wdrażanie.

W naszym systemie domyślne ustawienia 1Mb / 10% autogrowth w SQL Server źle działają z naszymi danymi. Zwłaszcza, że ​​mamy starszą aplikację, która uniemożliwia nam znaczną zmianę schematu. Chcemy, aby ustawienia bazy danych były konfigurowane na poziomie instancji, abyśmy mogli to zmienić w przypadku wdrożeń etapowych.

Czytałem w kilku miejscach, że domyślne ustawienia dla nowej bazy danych są oparte na ustawieniach dla „modelu”, ale wydaje się, że działa to tylko poprzez kliknięcie nowej bazy danych w interfejsie użytkownika SQL Management Studio, a nie ze skryptu, np. 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

Czy ktoś rzeczywiście ma to do pracy ze skryptem tworzenia? Czy istnieje inny sposób ustawienia autogrowth dla instancji serwera?

Michelle Steele
źródło
5
Jeśli piszesz to, CREATE DATABASEdlaczego nie możesz po prostu określić tego w skrypcie?
JNK
1
@JNK Myślę, że chce, aby dziedziczył, zamiast sprawdzać, co to powinno być. I powinien to zrobić, ale muszę się zgodzić, że tak nie jest (i nie robi tego również w 2012 r.). Właściwie nie uwierzyłem, dopóki tego nie wypróbowałem - jestem pewien, że w pewnym momencie działało to poprawnie. Może regresja z poprawek błędów dla tej rzeczy 10000% .
Aaron Bertrand
Czy w takim razie dane te są gdzieś dostępne w DMV? czy mógłbyś to zrobić, sprawdzając odpowiednie tabele w tabelach systemowych lub DMV?
JNK
Aby to wyjaśnić, wolelibyśmy odziedziczyć. Posiadamy dużą liczbę serwerów db z różnym miejscem do przechowywania danych w naszych środowiskach etapowych, a kontrolowanie zmian skryptów w zależności od środowiska byłoby na tym etapie więcej pracy. @ Pomysł JNK to taki, o którym nie myślałem. Wygląda na to, że może być zapytanie, które pomoże: beyondrelational.com/modules/2/blogs/28/posts/10326/…
Michelle Steele

Odpowiedzi:

2

W przypadku programu SQL Server 2005+ można użyć następujących opcji:

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

Spowoduje to pobranie definicji plików dla bazy danych modeli.
Później możesz używać go w CREATE DATABASE lub ALTER DATABASE.

SSMS faktycznie używa SMO do pobrania tych parametrów, a następnie tworzy skrypt, który wygląda następująco:

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

Jeśli twoja aplikacja tworzy bazę danych i nie możesz jej modyfikować -
musisz użyć ZMIEŃ bazę danych po zakończeniu tworzenia:

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

Wymaga to przynajmniej uprawnienia ALTER DATABASE
(implikowane przez ALTER ANY DATABASE Server Permission).
Oczywiście można wygenerować ten skrypt przy użyciu pierwszej próbki kodu (FROM sys.master_files).

Nie użyłbym sysaltfiles dla SQL Server 2008R2, ponieważ jest on przestarzały.

Powodzenia,
Roi

Roi Gavish
źródło
0

Co powiesz na:

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
źródło
ps. więcej informacji na temat tej tabeli tutaj: msdn.microsoft.com/en-us/library/ms181338.aspx . W powyższym kodzie nie uwzględniłem przypadku maxsize = 0 (tj. Brak wzrostu) i zamaskowałem kod stanu, ponieważ miałem inną wartość procentową niż w dokumentacji, ale byłem w stanie sprawić, by wartości były porównywalne poprzez maskowanie. Nie martwię się o kod statusu 0, ponieważ zajmuje się nim maxsize (gdyby został zaimplementowany).
JohnLBevan,