Câu lệnh 'Tạo cơ sở dữ liệu' của SQL Server. Làm thế nào để kế thừa cài đặt tự động phát triển?


9

Tôi đang sử dụng SQL Server 2008 R2 và tạo cơ sở dữ liệu thông qua triển khai liên tục.

Trong hệ thống của chúng tôi, cài đặt tự động 1Mb / 10% mặc định trong SQL Server hoạt động không tốt với dữ liệu của chúng tôi. Đặc biệt là khi chúng tôi có một ứng dụng kế thừa ngăn chúng tôi thay đổi lược đồ nhiều. Chúng tôi muốn các cài đặt cơ sở dữ liệu được cấu hình ở cấp thể hiện để chúng tôi có thể thay đổi nó để triển khai theo giai đoạn.

Tôi đã đọc ở một số nơi rằng các cài đặt mặc định cho db mới dựa trên các cài đặt cho 'model', nhưng có vẻ như nó chỉ hoạt động bằng cách nhấp vào cơ sở dữ liệu mới trong UI Studio của SQL Management chứ không phải từ tập lệnh, ví dụ CREATE DATABASE [MyDb].

msdn.microsoft.com/en-us/l Library / ms186388 (v = sql.105) .aspx

sqlservercentral.com/Forums/Topic1065073-391-1.aspx

/programming/8828557/possible-to-configure-database-autogrowth-sinstall-at-the-instance-level/8828604#comment15586568_8828604

Có ai thực sự có được điều này để làm việc với một kịch bản tạo? Có cách nào khác để tôi có thể thiết lập chế độ tự động cho mỗi phiên bản máy chủ không?


5
Nếu bạn đang viết kịch bản với CREATE DATABASElý do tại sao bạn không thể chỉ định nó trong tập lệnh của mình?
JNK

1
@JNK Tôi nghĩ rằng anh ấy muốn nó được thừa kế hơn là phải kiểm tra xem nó nên như thế nào. Và nó nên làm điều đó, nhưng tôi phải đồng ý rằng nó không (và nó cũng không làm điều đó vào năm 2012). Tôi thực sự đã không tin nó cho đến khi tôi thử nó - tôi chắc chắn rằng điều này hoạt động chính xác tại một số điểm. Có thể một hồi quy từ sửa lỗi cho điều 10000% đó .
Aaron Bertrand

Trong trường hợp đó, những số liệu có sẵn trong DMV ở đâu đó không? bạn có thể viết kịch bản ra bằng cách truy vấn các bảng hệ thống hoặc DMV cho các giá trị phù hợp không? '
JNK

Để làm rõ, chúng tôi thà thừa kế. Chúng tôi có một số lượng lớn máy chủ db với lưu trữ dữ liệu khác nhau trên các môi trường được tổ chức và việc kiểm soát các thay đổi tập lệnh trên mỗi môi trường sẽ hoạt động nhiều hơn ở giai đoạn này. Ý tưởng của @ JNK là ý tưởng mà tôi chưa từng nghĩ tới. Có vẻ như có thể có một truy vấn sẽ giúp: beyondrelational.com/modules/2/bloss/28/posts/10326/ Kẻ
Michelle Steele

Câu trả lời:


2

Đối với SQL Server 2005+ Bạn có thể sử dụng như sau:

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

Điều này sẽ lấy định nghĩa tệp cho cơ sở dữ liệu mô hình.
Sau này, bạn có thể sử dụng nó trong CREATE DATABASE hoặc ALTER DATABASE.

SSMS thực sự sử dụng SMO để lấy các tham số này và sau đó tạo ra một Script giống như:

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

Nếu Ứng dụng của bạn đang tạo Cơ sở dữ liệu và Bạn không thể sửa đổi ứng dụng -
thì Bạn phải sử dụng ALTER DATABASE sau khi tạo xong:

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

Điều này đòi hỏi ít nhất Quyền ALTER DATABASE
(ngụ ý bởi ALTER ANY DATABASE
Perm Perm Server) Rõ ràng, Bạn có thể tạo tập lệnh đó bằng cách sử dụng mẫu mã đầu tiên (TỪ sys.master_files).

Tôi sẽ không sử dụng sysaltfiles cho SQL Server 2008R2 vì nó không dùng nữa.

Chúc may mắn,
Roi


0

Làm thế nào về:

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. thêm thông tin về bảng này ở đây: msdn.microsoft.com/en-us/l Library / ms181338.aspx . Trong mã của tôi ở trên, tôi đã không tính đến trường hợp maxsize = 0 (tức là không tăng trưởng) và đã che giấu mã trạng thái vì tôi có một tỷ lệ khác với tỷ lệ phần trăm so với những gì trong tài liệu, nhưng có thể làm cho các giá trị có thể so sánh được thông qua mặt nạ. Tôi không lo lắng về mã trạng thái 0, vì nó được chăm sóc bởi maxsize (đã được triển khai).
JohnLBevan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.