Declaración de SQL Server 'Crear base de datos'. ¿Cómo heredar la configuración de crecimiento automático?

9

Estoy usando SQL Server 2008 R2 y creando bases de datos a través de una implementación continua.

En nuestro sistema, la configuración predeterminada de crecimiento automático de 1Mb / 10% en SQL Server funciona mal con nuestros datos. Particularmente porque tenemos una aplicación heredada que nos impide cambiar mucho el esquema. Nos gustaría que la configuración de la base de datos se configure a nivel de instancia para que podamos cambiarla para implementaciones por etapas.

He leído en varios lugares que la configuración predeterminada para una nueva base de datos se basa en la configuración del 'modelo', pero parece que esto solo funciona haciendo clic en una nueva base de datos en la interfaz de usuario del estudio de administración de SQL y no en un script, por ejemplo, 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

¿Alguien realmente tiene esto para trabajar con un script de creación? ¿Hay alguna otra manera de configurar el crecimiento automático por instancia de servidor?

Michelle Steele
fuente
55
Si está escribiendo un script con CREATE DATABASE¿ por qué no puede especificarlo en su script?
JNK
1
@JNK Creo que quiere que herede en lugar de tener que verificar qué debería ser. Y debería hacerlo, pero tengo que estar de acuerdo en que no lo hace (y tampoco lo hará en 2012). De hecho, no lo creí hasta que lo probé, estoy seguro de que funcionó correctamente en algún momento. Tal vez una regresión de correcciones de errores para esa cosa 10000% .
Aaron Bertrand
En ese caso, ¿están disponibles esas cifras en un DMV en alguna parte? ¿podría escribirlo mediante una consulta en las tablas del sistema o en los DMV para obtener los valores adecuados?
JNK
Para aclarar, preferimos heredar. Tenemos una gran cantidad de servidores de base de datos con almacenamiento de datos variable en nuestros entornos por etapas y controlar los cambios de script por entorno sería más trabajo en esta etapa. La idea de @ JNK es una en la que no había pensado. Parece que puede haber una consulta que ayudará: beyondrelational.com/modules/2/blogs/28/posts/10326/…
Michelle Steele

Respuestas:

2

Para SQL Server 2005+ Puede usar lo siguiente:

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

Esto recuperará las definiciones de archivo para la base de datos modelo.
Más adelante, puede usarlo en CREATE DATABASE o ALTER DATABASE.

SSMS en realidad usa SMO para recuperar estos parámetros y luego crea un Script que se ve así:

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 su aplicación está creando la base de datos y no puede modificar la aplicación,
debe usar ALTER DATABASE después de que se haya creado:

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

Esto requiere al menos ALTER DATABASE Permission
(implícito por ALTER CUALQUIER DATABASE Server Permission)
Obviamente, puede generar ese script utilizando el primer ejemplo de código (FROM sys.master_files).

No usaría sysaltfiles para SQL Server 2008R2 porque está en desuso.

Buena suerte
Roi

Roi Gavish
fuente
0

Qué tal si:

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
fuente
PD. Más información sobre esta tabla aquí: msdn.microsoft.com/en-us/library/ms181338.aspx . En mi código anterior, no he tenido en cuenta el caso maxsize = 0 (es decir, sin crecimiento), y he enmascarado el código de estado ya que tenía una cifra diferente de porcentajes de lo que está en la documentación, pero pude hacer que los valores sean comparables a través de enmascaramiento No me preocupa el código de estado 0, ya que maxsize se encarga de eso (si se implementó).
JohnLBevan