Istruzione "Crea database" di SQL Server. Come ereditare le impostazioni di crescita automatica?


9

Sto usando SQL Server 2008 R2 e la creazione di database attraverso la distribuzione continua.

Nel nostro sistema, le impostazioni predefinite di crescita automatica da 1 Mb / 10% in SQL Server funzionano male con i nostri dati. Soprattutto perché abbiamo un'applicazione legacy che ci impedisce di cambiare molto lo schema. Vorremmo che le impostazioni del database fossero configurate a livello di istanza in modo da poterle modificare per le distribuzioni graduali.

Ho letto in diversi punti che le impostazioni predefinite per un nuovo db si basano sulle impostazioni per "modello", ma sembra che funzioni solo facendo clic su un nuovo database nell'interfaccia utente di SQL Management Studio e non da uno script, ad esempio 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

Qualcuno l'ha davvero fatto funzionare con uno script di creazione? C'è un altro modo in cui posso impostare la crescita automatica per istanza del server?


5
Se lo stai scrivendo con il CREATE DATABASEmotivo perché non puoi semplicemente specificarlo nel tuo script?
JNK

1
@JNK Penso che voglia ereditare piuttosto che dover controllare cosa dovrebbe essere. E dovrebbe farlo, ma devo essere d'accordo sul fatto (e non lo farà neanche nel 2012). In realtà non ci credevo fino a quando non l'ho provato - sono sicuro che a un certo punto ha funzionato correttamente. Forse una regressione da correzioni di bug per quella cosa del 10000% .
Aaron Bertrand

In quel caso quei dati sono disponibili in un DMV da qualche parte? potresti scriverlo eseguendo una query sulle tabelle di sistema o sui DMV per valori appropriati? "
JNK

Per chiarire, preferiremmo ereditare. Disponiamo di un gran numero di server db con una diversa archiviazione dei dati nei nostri ambienti in fasi e il controllo delle modifiche agli script per ambiente sarebbe più impegnativo in questa fase. L'idea di @ JNK è quella a cui non avevo pensato. Sembra che ci possa essere una query che aiuterà: beyondrelational.com/modules/2/blogs/28/posts/10326/…
Michelle Steele,

Risposte:


2

Per SQL Server 2005+ È possibile utilizzare quanto segue:

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

In questo modo verranno recuperate le definizioni dei file per Database modello.
Successivamente puoi usarlo in CREATE DATABASE o ALTER DATABASE.

SSMS effettivamente utilizza SMO per recuperare questi parametri e quindi crea uno script che assomiglia a:

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 l'applicazione sta creando il database e non è possibile modificarla,
è necessario utilizzare ALTER DATABASE al termine della creazione:

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

Ciò richiede almeno l'autorizzazione ALTER DATABASE
(implicita da ALTER ANY DATABASE Autorizzazione server)
Ovviamente, è possibile generare quello script usando il primo esempio di codice (FROM sys.master_files).

Non userei sysaltfile per SQL Server 2008R2 perché è obsoleto.

Buona fortuna,
Roi


0

Che ne dite di:

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 + '
    ) 
')

ps. maggiori informazioni su questa tabella qui: msdn.microsoft.com/en-us/library/ms181338.aspx . Nel mio codice sopra non ho preso in considerazione il caso maxsize = 0 (ovvero nessuna crescita) e ho mascherato il codice di stato poiché avevo una cifra diversa per le percentuali rispetto a ciò che è nella documentazione, ma sono stato in grado di rendere i valori comparabili tramite mascheramento. Non sono preoccupato per il codice di stato 0, dato che è gestito da maxsize (se implementato).
JohnLBevan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.