Pernyataan SQL Server 'Buat Database'. Bagaimana cara mewarisi pengaturan autogrowth?

9

Saya menggunakan SQL Server 2008 R2 dan membuat database melalui penerapan berkelanjutan.

Dalam sistem kami, pengaturan autogrowth 1Mb / 10% default di SQL Server berfungsi buruk dengan data kami. Terutama karena kami memiliki aplikasi warisan yang mencegah kami mengubah banyak skema. Kami ingin pengaturan basis data dikonfigurasikan pada tingkat instance sehingga kami dapat mengubahnya untuk penerapan bertahap.

Saya telah membaca di beberapa tempat bahwa pengaturan default untuk db baru didasarkan pada pengaturan untuk 'model', tetapi tampaknya ini hanya berfungsi dengan mengklik database baru di SQL Management studio UI dan bukan dari skrip misalnya 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

Adakah yang benar-benar membuat ini berfungsi dengan skrip buat? Apakah ada cara lain saya dapat mengatur autogrowth per instance server?

Michelle Steele
sumber
5
Jika Anda membuat skrip dengan CREATE DATABASEmengapa Anda tidak bisa menentukannya dalam skrip?
JNK
1
@ JNK Saya pikir dia ingin mewarisi daripada harus memeriksa apa yang seharusnya. Dan itu harus melakukan itu, tetapi saya harus setuju bahwa itu tidak (dan itu juga tidak dilakukan pada tahun 2012). Saya sebenarnya tidak percaya sampai saya mencobanya - saya yakin ini bekerja dengan benar di beberapa titik. Mungkin regresi dari perbaikan bug untuk hal 10.000% itu .
Aaron Bertrand
Dalam hal apakah angka-angka itu tersedia di DMV di suatu tempat? bisakah Anda membuat skrip dengan meminta kueri tabel sistem atau DMV untuk nilai yang sesuai? '
JNK
Untuk memperjelas, Kami lebih memilih mewarisi. Kami memiliki sejumlah besar server db dengan beragam penyimpanan data di seluruh lingkungan yang dipentaskan dan mengendalikan perubahan skrip per lingkungan akan lebih berfungsi pada tahap ini. @ JNK adalah ide yang saya tidak pikirkan. Sepertinya ada permintaan yang akan membantu: beyondrelational.com/modules/2/blogs/28/posts/10326/…
Michelle Steele

Jawaban:

2

Untuk SQL Server 2005+ Anda dapat menggunakan yang berikut ini:

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

Ini akan mengambil definisi File untuk Model Database.
Nantinya, Anda dapat menggunakannya di CREATE DATABASE atau ALTER DATABASE.

SSMS sebenarnya menggunakan SMO untuk mengambil parameter ini dan kemudian membuat Script yang terlihat seperti:

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

Jika Aplikasi Anda membuat Database dan Anda tidak dapat mengubah aplikasi -
maka Anda harus menggunakan ALTER DATABASE setelah pembuatan dilakukan:

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

Ini membutuhkan setidaknya ALTER DATABASE Izin
(tersirat oleh ALTER APAPUN DATABASE Izin Server)
Jelas, Anda dapat menghasilkan skrip itu menggunakan sampel kode pertama (FROM sys.master_files).

Saya tidak akan menggunakan sysaltfiles untuk SQL Server 2008R2 karena sudah usang.

Semoga beruntung,
Roi

Roi Gavish
sumber
0

Bagaimana tentang:

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
sumber
ps. info lebih lanjut tentang tabel ini di sini: msdn.microsoft.com/en-us/library/ms181338.aspx . Dalam kode saya di atas, saya belum memperhitungkan kasus maxsize = 0 (yaitu tidak ada pertumbuhan), dan telah menyembunyikan kode status karena saya memiliki angka yang berbeda untuk persentase dengan apa yang ada dalam dokumentasi, tetapi mampu membuat nilai-nilai dapat dibandingkan melalui topeng. Saya tidak khawatir tentang kode status 0, karena sudah ditangani secara maksimal (apakah sudah diterapkan).
JohnLBevan