2010-11-25 1 views
24

Visual Studio 데이터베이스 프로젝트를 사용하여 데이터베이스를 정적 ​​소스 제어 데이터로 채우는 방법은 무엇입니까? 아래의 세 가지 전략을 모두 시도해 보았습니다. 각 전략은 점차적으로 개선 될 것입니다. 나는 전략 3에 완전히 만족하지는 않지만 사용하고있다. 다른 대안이 있는가?Visual Studio 2010 데이터베이스 프로젝트를 사용하여 정적 데이터를 채우는 가장 좋은 방법은 무엇입니까?

  1. "데이터 생성 계획"폴더에 삽입 스크립트를 배치하십시오. "Script.PostDeployment.sql"파일의 스크립트를 참조하여 배포 프로세스에 포함하십시오.

    - 장점 : 솔직
    - 단점 : slooooooow
    - 단점 : 이후의 전개함에 먼저 정적 데이터를 삭제하거나 데이터의 비 존재 =를 확인해야한다> 비효율적

  2. 삽입 데이터 가장 편리한 방법 (예 : SSMS 편집 테이블 기능)을 사용하여 데이터베이스에 처음으로 추가 할 수 있습니다. bcp 명령 행 유틸리티를 사용하여 해당 데이터를 추출하여 많은 데이터 파일을 작성하고이를 프로젝트에 추가하십시오. 각 데이터 파일에 대해 "대량 삽입"문을 실행하는 "Scripts.PostDeployment.sql"파일에서 참조되는 스크립트를 만듭니다.

    - 장점 : insert 문보다 훨씬 빠르게
    - 장점 : 활용할 수 SSMS 편집 테이블 기능
    - 단점 : 각 대량 삽입 문은 데이터 파일에 대한 완전한 파일 이름을 요구할 경우 데이터 파일 내 컴퓨터의 "C : \ Projects \ Dev \ Source \ foo.dat"에있는 경우 원격 장치가 해당 위치에 있어야하거나 대량 삽입 문이 실패합니다.
    - 단점 : 이전에 기존 정적 데이터를 삭제해야합니다. 후속 배포시 대량 삽입 문 실행

  3. 정적 데이터를 보관하기 위해 배포 중에 임시 테이블을 만듭니다. d sql merge 문을 사용하여이 테이블을 대상 테이블과 동기화합니다. 블로그 게시물 theseeither을 참조하십시오.

    - 장점 : SQL 병합 것 같아이 문제
    을위한 완벽한 의미 - 단점 :이 전략에 대한 논리가 각 파일 반복된다 - 단점 : 테이블 정의가 SQL에서 임시 테이블로 반복 파일 병합

우수한 대체 전략이 있습니까? 너무 느리기 때문에 전략 1을 포기했습니다. 필자는 정규화 된 파일 이름 문제로 인해 전략 2를 싫어합니다. 나는 만족 스럽지만 전략 3에 오싹 오싹하지 않는다.

+0

는 것이 아니라, 대상 데이터베이스의 데이터를 떠날 수있는 옵션이 있습니까 그 때마다를 다시 채우기? –

+0

@David : 나는 누군가가 그렇지 않으면 말할 수 없으면 그러한 옵션이 있다고 생각하지 않는다. 어떻게 든 스크립팅 된 솔루션의 일부가되어야합니다. 전략 3은 병합 명령으로이를 처리합니다. 전략 1은 삽입 전에 데이터가 존재하는지 먼저 확인하도록 수정되어야합니다. 마찬가지로 전략 2도 마찬가지입니다. –

+0

아마도 여러분에게 위안은 없지만 정적 데이터 지원이있는 SQL 소스 제어 2를 방금 출시했습니다. 슬프게도 이것은 데이터베이스 프로젝트를 지원하지 않습니다. 그러나 우리는 이것을 심각하게 고려하고 있습니다. 관심이 있으시면 여기에서 투표하십시오. http://redgate.uservoice.com/forums/39019-sql-source-control/suggestions/1010465-work-with-a-visual-studio-2010-database- project? ref = title –

답변

0

아직 VS 2010 db 프로젝트를 프로덕션으로 롤백하지는 않았지만 사내 프로젝트의 경우 프로덕션 데이터베이스를 대상 데이터베이스에로드하고 개발/테스트 단계에서 프로덕션 데이터베이스를 빌드/배포합니다. 즉, 여러 개의 prod 데이터베이스와 각각의 외부로 이동하는 정적 데이터가있는 경우 아마도 Tim에 대해 작동하지 않을 것입니다. 그러나, 그것은 우리와 같은 단일 prod db 상점을 위해 할 수 있습니다.

+1

답장을 보내 주셔서 감사합니다. 좀 더 자세히 설명해 주시겠습니까? 그럼 당신은 백업 생산성, 대상 (따라서 대상이 모든 데이터를 가지고) 복원 후 VS에서 스키마를 동기화 VS에서 배포를 실행합니까? 그게 사실이라면, 누군가가 피해자에게 데이터를 추가하는 것을 막을 수없는 것처럼 보입니다. 소스 제어 방식으로 다음과 같이 말하고 있습니다. "이것은 우리의 기준 데이터이며 배포를 클릭하면 대상에 존재한다는 것을 확신합니다." 결론적으로 같은 방법은 다음을 지원합니다. "반복적으로 배포 할 수있는 테스트 케이스를 구성하는 데이터 모음입니다." –

8

삽입하십시오.sql 스크립트를 사용하는 경우 [__RefactorLog] 테이블 (배포시 사용되는 시스템 테이블)에 GUID를 넣고 다음과 같이 데이터를 삽입하기 전에 GUID가 있는지 확인하십시오.

: setvar SOMEID "784B2FC9-2B1E-5798 // 도구로 GUID를 만들 -8478-24EE856E62AE는 "NOT이있는 경우

VS2010에서 CreateGuid을 \ ([OperationKey] [DBO]에서 선택합니다. [__ RefactorLog] 여기서 [OperationKey] = '$ (SOMEID)')

...

INSERT를

을 BEGIN

[DBO] INTO. __ RefactorLog] ([OperationKey]) 값 ('$ (SOMEID)')

END

은 그럼 당신은 존재하지 경우에만 데이터를 삽입하거나 (GUID를 변경하여) 원하는 경우 .

1

당신은 다른 컴퓨터에서 실행하는 cmd를 도구는 당신의보기 VS2010 IDE에서 함께 없습니다입니다 대상 데이터베이스 를 업데이트하기 위해 데이터베이스 프로젝트에서 스키마 출력을 사용할 수 있습니다

그래서 데이터는 여전히 될 것입니다 당신이 모든 열

2

에 방울을하지 않는 한 동일, 이것은 내가 경우 다른 사람이 문제를 해결하는 방법이다이 유용한 ...

전략은 데이터베이스 프로젝트를 빌드하기 전에 sqlcmdvars 변수를 설정하는 것입니다 찾습니다. 이 변수에는 배포 후 스크립트에서 참조 할 수있는 빌드 폴더의 절대 경로가 포함됩니다. 그런 다음 필요한 추가 파일이나 리소스를 배치 스크립트에서 사용하는 것은 간단합니다. 이 전략의 장점은 하드 코딩 된 공유 경로가 필요하지 않고 모든 경로가 프로젝트 파일에 상대적이라는 것입니다.

새 Sql 명령 변수 이름 $ (MSBuildProjectDirectory)를 만듭니다. 이것은 prebuild 스크립트에서 오버 라이드됩니다.

sql 명령 변수를 설정하고 데이터베이스를 작성하는 msbuild 스크립트를 만듭니다.

<Project ToolsVersion="4.0" DefaultTargets="BuildDatabase" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 
<PropertyGroup> 
    <DatabaseServer>(Local)</DatabaseServer> 
    <DeploymentConnectionString>Data Source=$(DatabaseServer)%3BIntegrated Security=True%3BPooling=False</DeploymentConnectionString> 
    <Configuration>Release</Configuration> 
</PropertyGroup> 
<Target Name="BuildDatabase"> 
    <!-- Sets the projet path variable so that the post deployment script can determine the location of the bulk insert csv files. --> 
    <XmlUpdate 
     Prefix="urn" 
     Namespace="urn:Microsoft.VisualStudio.Data.Schema.Package.SqlCmdVars" 
     XmlFileName="$(MSBuildProjectDirectory)\DatabaseProjectName\Properties\Database.sqlcmdvars" 
     XPath="/urn:SqlCommandVariables/urn:Properties/urn:Property[urn:PropertyName='MSBuildProjectDirectory']/urn:PropertyValue" 
     Value="$(MSBuildProjectDirectory)\DatabaseProjectName" /> 

    <MSBuild 
      Projects="DatabaseProjectName\DatabaseProjectName.dbproj" 
      Properties="Configuration=$(Configuration); 
        TargetDatabase=DatabaseName; 
        TargetConnectionString=$(DeploymentConnectionString); 
        GenerateDropsIfNotInProject=True; 
        BlockIncrementalDeploymentIfDataLoss=False; 
        DeployToDatabase=True; 
        IgnorePermissions=True" 
      Targets="Build;Deploy"> 
     <Output TaskParameter="TargetOutputs" ItemName="SqlFiles"/> 
    </MSBuild> 
</Target> 

업데이트 게시물 배포 스크립트는 ... 다음과 같이

BULK INSERT [dbo].[TableName] FROM '$(MSBuildProjectDirectory)\Scripts\Post-Deployment\Data\YourDataFile.csv' 
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR='\n') 
관련 문제