SQL Server 'Create Database'문. 자동 성장 설정을 상속받는 방법?


9

SQL Server 2008 R2를 사용하고 지속적인 배포를 통해 데이터베이스를 만들고 있습니다.

우리 시스템에서는 SQL Server의 기본 1Mb / 10 % 자동 증가 설정이 데이터와 제대로 작동하지 않습니다. 특히 스키마를 많이 변경하지 못하게하는 레거시 응용 프로그램이 있습니다. 데이터베이스 설정을 인스턴스 레벨에서 구성하여 단계별 배치를 위해 변경할 수 있습니다.

새 데이터베이스에 대한 기본 설정이 'model'에 대한 설정을 기반으로한다는 것을 여러 곳에서 읽었지만, CREATE DATABASE [MyDb]와 같은 스크립트가 아닌 SQL Management studio UI에서 새 데이터베이스를 클릭해야만 작동하는 것으로 보입니다.

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

실제로 작성 스크립트로 작업 할 사람이 있습니까? 서버 인스턴스 당 자동 증가를 설정할 수있는 다른 방법이 있습니까?


5
스크립트를 사용하여 스크립트를 작성하는 경우 CREATE DATABASE왜 스크립트에서 스크립트를 지정할 수 없습니까?
JNK

1
@JNK 나는 그것이 무엇인지 확인하는 대신 상속하기를 원한다고 생각합니다. 그리고 그렇게해야하지만 2012 년에는 그렇지 않다는 것에 동의해야합니다. 나는 그것을 시도 할 때까지 실제로 그것을 믿지 않았습니다.이 시점에서 이것이 올바르게 작동했다고 확신합니다. 아마도 그 10000 % 일에 대한 버그 수정으로 인한 회귀 일 수 있습니다.
Aaron Bertrand

이 경우 DMV에서 이러한 수치를 이용할 수 있습니까? 적절한 값을 얻기 위해 시스템 테이블이나 DMV를 쿼리하여 스크립트를 작성할 수 있습니까? '
JNK

명확히하기 위해, 우리는 오히려 상속받을 것입니다. 우리는 단계별 환경에 따라 다양한 데이터 스토리지를 갖춘 많은 수의 db 서버를 보유하고 있으며 환경마다 스크립트 변경을 제어하는 ​​것이이 단계에서 더 많은 작업이 될 것입니다. @JNK의 아이디어는 내가 생각하지 못한 것입니다. : 도움이되는 쿼리가있을 수 있습니다 것 같습니다 beyondrelational.com/modules/2/blogs/28/posts/10326/...
미셸 스틸

답변:


2

SQL Server 2005+의 경우 다음을 사용할 수 있습니다.

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

모델 데이터베이스에 대한 파일 정의를 검색합니다.
나중에 CREATE DATABASE 또는 ALTER DATABASE에서 사용할 수 있습니다.

SSMS는 실제로 SMO를 사용하여 이러한 매개 변수를 검색 한 후 다음과 같은 스크립트를 만듭니다.

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

애플리케이션이 데이터베이스를 작성 중이고 애플리케이션을 수정할 수없는
경우 작성이 완료된 후 ALTER DATABASE를 사용해야합니다.

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

최소한 ALTER DATABASE 권한이 필요합니다
(ALTER ANY DATABASE 서버 권한에 의해 암시 됨
). 첫 번째 코드 샘플 (FROM sys.master_files)을 사용하여 해당 스크립트를 생성 할 수 있습니다.

더 이상 사용되지 않으므로 SQL Server 2008R2에 sysaltfile을 사용하지 않습니다.

행운을 빌어 요,
투자 수익 (ROI)


0

어때요 :

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

추신. 이 테이블에 대한 자세한 내용은 여기 : msdn.microsoft.com/en-us/library/ms181338.aspx를 참조하십시오 . 위의 코드에서 maxsize = 0 사례 (예 : 성장 없음)를 설명하지 않았으며 문서의 내용과 다른 비율을 보였지만 값을 비교할 수 있었기 때문에 상태 코드를 숨겼습니다. 마스킹. maxsize에 의해 처리되기 때문에 0 상태 코드에 대해 걱정하지 않습니다 (구현되었습니다).
JohnLBevan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.