Instruction «Créer une base de données» de SQL Server. Comment hériter des paramètres de croissance automatique?

9

J'utilise SQL Server 2008 R2 et je crée des bases de données via un déploiement continu.

Dans notre système, les paramètres de croissance automatique 1 Mo / 10% par défaut dans SQL Server fonctionnent mal avec nos données. D'autant plus que nous avons une application héritée qui nous empêche de beaucoup changer le schéma. Nous souhaitons que les paramètres de la base de données soient configurés au niveau de l'instance afin de pouvoir les modifier pour les déploiements par étapes.

J'ai lu à plusieurs endroits que les paramètres par défaut d'une nouvelle base de données sont basés sur les paramètres du `` modèle '', mais il semble que cela ne fonctionne qu'en cliquant sur une nouvelle base de données dans l'interface utilisateur de SQL Management studio et non à partir d'un script, par exemple 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

Quelqu'un a-t-il réellement réussi à travailler avec un script de création? Existe-t-il un autre moyen de définir la croissance automatique par instance de serveur?

Michelle Steele
la source
5
Si vous l'écrivez, CREATE DATABASEpourquoi ne pouvez-vous pas simplement le spécifier dans votre script?
JNK
1
@JNK Je pense qu'il veut qu'il hérite plutôt que de devoir vérifier ce qu'il devrait être. Et cela devrait le faire, mais je dois convenir que ce n'est pas le cas (et il ne le fera pas non plus en 2012). En fait, je n'y ai pas cru avant de l'avoir essayé - je suis sûr que cela a fonctionné correctement à un moment donné. Peut-être une régression des corrections de bugs pour cette chose à 10000% .
Aaron Bertrand
Dans ce cas, ces chiffres sont-ils disponibles dans un DMV quelque part? pourriez-vous éventuellement l'écrire en interrogeant les tables système ou les DMV pour les valeurs appropriées?
JNK
Pour clarifier, nous préférons hériter. Nous avons un grand nombre de serveurs de base de données avec un stockage de données variable dans nos environnements intermédiaires et contrôler les changements de script par environnement serait plus de travail à ce stade. @ L'idée de JNK est une idée à laquelle je n'avais pas pensé. Il semble qu'il puisse y avoir une requête qui vous aidera: au- delà de relationnel.com/modules/2/blogs/28/posts/10326/…
Michelle Steele

Réponses:

2

Pour SQL Server 2005+ Vous pouvez utiliser les éléments suivants:

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

Cela permettra de récupérer les définitions de fichiers pour la base de données de modèles.
Plus tard, vous pouvez l'utiliser dans CREATE DATABASE ou ALTER DATABASE.

SSMS utilise réellement SMO pour récupérer ces paramètres, puis crée un script qui ressemble à:

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

Si votre application crée la base de données et que vous ne pouvez pas modifier l'application,
vous devez utiliser ALTER DATABASE une fois la création terminée:

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

Cela nécessite au moins l'autorisation ALTER DATABASE
(impliquée par l'autorisation du serveur ALTER ANY DATABASE).
De toute évidence, vous pouvez générer ce script à l'aide du premier exemple de code (FROM sys.master_files).

Je n'utiliserais pas sysaltfiles pour SQL Server 2008R2 car il est obsolète.

Bonne chance,
Roi

Roi Gavish
la source
0

Que diriez-vous:

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
la source
ps. plus d'informations sur ce tableau ici: msdn.microsoft.com/en-us/library/ms181338.aspx . Dans mon code ci-dessus, je n'ai pas pris en compte le cas maxsize = 0 (c'est-à-dire pas de croissance) et j'ai masqué le code d'état car j'avais un chiffre différent pour les pourcentages par rapport à ce qui est dans la documentation, mais j'ai pu rendre les valeurs comparables via masquage. Je ne m'inquiète pas du code d'état 0, car cela est pris en charge par maxsize (s'il a été implémenté).
JohnLBevan