Instrução 'Criar banco de dados' do SQL Server. Como herdar configurações de crescimento automático?

9

Estou usando o SQL Server 2008 R2 e criando bancos de dados por meio de implantação contínua.

Em nosso sistema, as configurações padrão de crescimento automático de 1Mb / 10% no SQL Server funcionam mal com nossos dados. Principalmente porque temos um aplicativo herdado que nos impede de alterar muito o esquema. Gostaríamos que as configurações do banco de dados fossem definidas no nível da instância para podermos alterá-las para implantações em etapas.

Eu li em vários lugares que as configurações padrão de um novo banco de dados são baseadas nas configurações de 'model', mas parece que isso só funciona clicando em novo banco de dados na interface do SQL Management studio e não em um script, por exemplo, 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

Alguém realmente conseguiu isso para trabalhar com um script de criação? Existe outra maneira de definir o crescimento automático por instância do servidor?

Michelle Steele
fonte
5
Se você está criando um script, por CREATE DATABASEque não pode simplesmente especificá-lo em seu script?
JNK
11
@JNK Acho que ele quer herdar, em vez de ter que verificar o que deveria ser. E deveria fazer isso, mas tenho que concordar que não (e também não o fará em 2012). Na verdade, eu não acreditei até tentar - tenho certeza de que funcionou corretamente em algum momento. Talvez uma regressão de correções de bugs para essa coisa de 10000% .
Aaron Bertrand
Nesse caso, esses números estão disponíveis em uma DMV em algum lugar? você poderia criar um script consultando as tabelas do sistema ou DMVs para obter os valores apropriados?
JNK
Para esclarecer, preferimos herdar. Temos um grande número de servidores db com armazenamento de dados variados em nossos ambientes intermediários e o controle de alterações de script por ambiente seria mais trabalhoso neste estágio. A idéia de @ JNK é uma que eu não tinha pensado. Parece que pode haver uma consulta que vai ajudar: beyondrelational.com/modules/2/blogs/28/posts/10326/...
Michelle Steele

Respostas:

2

Para o SQL Server 2005+, você pode usar o seguinte:

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

Isso recuperará as definições de arquivo para o banco de dados de modelos.
Posteriormente, você pode usá-lo em CREATE DATABASE ou ALTER DATABASE.

Na verdade, o SSMS usa o SMO para recuperar esses parâmetros e cria um script parecido com:

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

Se o seu aplicativo estiver criando o banco de dados e você não puder modificá
-lo, será necessário usar ALTER DATABASE após a criação:

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

Isso requer pelo menos a permissão ALTER DATABASE
(implícita na permissão do servidor ALTER ANY DATABASE).
Obviamente, você pode gerar esse script usando o primeiro exemplo de código (FROM sys.master_files).

Eu não usaria sysaltfiles para o SQL Server 2008R2 porque está obsoleto.

Boa sorte,
Roi

Roi Gavish
fonte
0

E se:

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
fonte
ps. mais informações sobre esta tabela aqui: msdn.microsoft.com/en-us/library/ms181338.aspx . No meu código acima, eu não considerei o caso maxsize = 0 (ou seja, sem crescimento) e ocultei o código de status, pois eu tinha um número diferente de porcentagens para o que está na documentação, mas consegui comparar os valores via mascaramento. Não estou preocupado com o código de status 0, uma vez que isso é resolvido pelo maxsize (se implementado).
JohnLBevan