2011-02-27 3 views
3

이것은 여기에 묻는 것조차도 나를 어리 석게 만드는 간단한 작업입니다. 그러나 오랫동안이 작업에 매달 렸기 때문에 여기에서 요청할 것입니다. Visual Studio에서 데이터 계층 응용 프로그램을 작업하고 있습니다. 테이블, 저장된 procs 및 일부 사후 전개 데이터와 같은 일반적인 것들을 가지고 있습니다. 기본적으로 데이터 계층 응용 프로그램에는 스크립트/배포 후 폴더가 있습니다. 이 폴더 안에 Script.PostDeployment.sql이라는 파일이 있습니다. 좀 더 조직화되기 위해서 StaticData 및 TestData로 배포 후 폴더를 만듭니다. 데이터 생성을위한 필자의 insert 문은이 폴더 내에 위치한다. 그래서,이 구조를 기반으로, 나는 나의 Script.PostDeployment.sql에 다음 코드를 추가하고 :데이터 계층 응용 프로그램 - 게시 이후 배포

/* 
Post-Deployment Script Template       
-------------------------------------------------------------------------------------- 
This file contains SQL statements that will be appended to the build script.  
Use SQLCMD syntax to include a file in the post-deployment script.   
Example:  :r .\myfile.sql        
Use SQLCMD syntax to reference a variable in the post-deployment script.  
Example:  :setvar TableName MyTable        
       SELECT * FROM [$(TableName)]     
-------------------------------------------------------------------------------------- 
*/ 

:r .\StaticData\States.sql 
:r .\TestData\Logins.sql 

문제는 위의 코드가 작동하지 않는 것입니다. starnge 이유로 인해 deploy 명령은 경로를 무시하고 적절한 하위 폴더가 아닌 Scripts/Post-Deployment에서 States.sql 및 Logins.sql을 찾습니다. 다른 사람이 비슷한 것을 만났습니까? 아주 간단한 문제지만,이 문제를 해결하기 위해 나를 영원히 데려가 라. 나는 설명하기 위해 최선을 다했지만 질문을하고 나는 일을 더 분명하게하려고 노력할 수있다. 감사합니다.

+0

그냥 몇 가지 포인트 : 비주얼 스튜디오의 (1) 버전을 사용중인

다음

는 생성 된 스크립트 파일 (단지 관련 섹션)인가? (2) 배포 명령이 작동하지 않는다고 말하면 Visual Studio의 빌드 메뉴에서 배포 명령을 의미합니까? (3) 경로를 무시하는 것을 어떻게 결정하고 있습니까? 출력 창에서 빌드 된 파일을보고 있습니까? 아니면 다른 것을보고 있습니까? –

+0

(1) SQL Server 2008 R2와 함께 Visual Studio 2010 Premium을 사용하고 있습니다. (2) 예 빌드 메뉴에서 배포 명령. (3) 비주얼 스튜디오가 경로를 무시하고 있다는 것을 알 수있는 방법은 출력 창을 볼 때입니다. - 오류 : 파일 '$ \ Scripts \ Post-Deployment \ States.sql'을 찾을 수 없습니다. –

+0

흠. 나는 그것을 경험하지 않는다. 그것은 나를 위해 매력처럼 작동하지만 SQL 2008 R2는이 컴퓨터에 설치되어 있지 않습니다. SQL Express와 VS2010 만 있으면됩니다. 오류를 유발하는 것이 사후 배포 스크립트의 행인지 확인합시다. 해당 줄을 제거하면 오류가 사라 집니까?또는 States.sql 및 Logins.sql 파일을 사후 배포 폴더에 복사하면 오류가 사라지나요? –

답변

6

샘플 코드를 살펴 보았습니다. 이 재현을 시도했을 때 Visual Studio 2010에서 SQL 2008 데이터베이스 프로젝트를 사용하고 있었지만 프로젝트가 데이터 계층 응용 프로그램이고 매우 다른 점은 무엇입니까? 데이터 계층 응용 프로그램을 사용하도록 전환하면보고있는 내용을 재현 할 수있었습니다.

데이터 계층 응용 프로그램은 개체 정의를 포함하고 배포 전 및 배포 스크립트와 같은 사용자 정의 스크립트도 포함하는 DAC 패키지를 생성합니다. 이제는 100 % 확신하지 못했습니다 (이전에는 DAC 패키지를 사용하지 않았기 때문에이를 관찰 및 연구에 기반하고 있습니다).하지만 DAC 패키지의 파일 구조가 하위 클래스를 지원하지 않는다고 생각합니다. Script \ Post-deployment 폴더 아래의 폴더. 나는 내부적으로 꽤 엄격한 폴더 구조를 가지고 있다고 가정하고있다. 따라서 DACCompiler는 배포 후 스크립트에서 파일 참조의 파일 이름 만 제거하도록 설계된 것으로 나타나며 디렉터리 경로는 무시합니다.

데이터 계층 응용 프로그램 here에 대한 백서가 있습니다. 여기에는 패키지에 배포 후 스크립트를 추가하는 절이 있으며이 섹션에는 다음을 비롯한 몇 가지 모범 사례가 있습니다.

• 솔루션 탐색기에서 작업 할 때 모든 사후 배포 스크립트를 포함하는 것이 좋습니다. Script.PostDeployment.sql 스크립트 파일의 배포 명령 이는 DAC 패키지에 배포 후 파일이 하나만 포함되어 있기 때문입니다. 즉, 여러 개의 파일을 만들어서는 안됩니다.

이제는 기술적으로 : r 명령이 수행하지만 명령을 수동으로 파일에 직접 포함시키는 것이 더 쉽습니다.

이것은 단순히 DACCompiler 디자인의 버그 일 수도 있습니다. 여기

내가 당신이 할 것을 권장 작업은 다음과 같습니다

지금은
  • 는 쉬운 일이 할 - 저는 믿습니다 - 스크립트를 이동 그냥 직접 배포 후 폴더 아래 까지; 서브 디렉토리가 이 아닌 것을 보완하기 위해 고유 한 설명적인 이름을 지정하십시오.
  • 하위 디렉토리를 유지하려면 사전 빌드 명령을 프로젝트에 추가하십시오. 이는 빌드 시작하기 전에 배포 후 디렉토리에 하위 디렉토리에서 스크립트를 복사가이 버그라고 생각한다면
  • , 또는 (당신은 스크립트가 고유의 파일 이름을 을 보장하기 위해 필요합니다)
    http://connect.microsoft.com/SQLServer 로 이동하는 것이 좋습니다, 존재해야 기능 그 제품의 향후 버전에서 제품 팀
    주소 그것. 이 권고의 이러한 종류를 만들에이 좋은 장소입니다, 피드백이 제품 팀으로 이동하기 때문에 는 피드백에 대한 투표를하실 수 있습니다 대형 에서 사용자 커뮤니티는 체중 증가, 제품 팀은 다시 통신 할 수 있습니다 의견에 대한 정보는 입니다.

그리고 물론, 다른 사람이 다른 대답을하고 있는지 알아볼 수 있습니다. 그러나 나는 아무도 아직 반응하지 않았다면 아마 추측하고있다. 나는 파기에서 아무것도 찾을 수 없었습니다.

이 정보가 도움이되기를 바랍니다. 지금 작업하게 할 수있는 방법을 제공해 줄 수 있으면 좋겠지 만 현재 디자인의 한계 내에서 작업하고 Connect에 피드백을 게시하는 것이 가장 좋습니다.

행운을 빈다.

+0

@ matthew-burr이 문제를 조사해 주셔서 감사합니다. –

0

나는이 문제가 파이프 라인에서 너무 늦어서 문제를 해결할 수 없다는 느낌이 들지만 한 번 볼 가치가 있습니다. dacpac 형식은 일련의 xml 파일과 SQL 스크립트가 포함 된 zip 파일입니다. 파일의 확장자를으로 변경하면 파일에 포함 된 파일에 액세스 할 수 있습니다. postdeploy.sql 파일에는 사후 배포 스크립트와이 스크립트가 참조하는 다른 항목의 집계가 포함되어야합니다.

0

저는 Visual Studio 2013을 사용하여이 기능을 시험해 보았습니다.

IF ('$(DeployType)' = 'Qualification') 
    BEGIN --Run scripts 
     PRINT 'Deploying Qualification Specific scripts.'  
     :r .\Qualification\"QualificationSpecificTestScript.sql" 
    END 
    ELSE IF ('$(DeployType)' = 'Production') 
    BEGIN --Run scripts 
     PRINT 'Deploying Production Specific scripts.' 
     :r .\Production\"ProductionSpecificTestScript.sql" 
    END 

내용 QualificationSpecificTestScript.sqlProductionSpecificScript.sql가 생성 된 후 배포 스크립트에 삽입됩니다. 설명에 대한

 IF ('$(DeployType)' = 'Qualification') 
    BEGIN --Run scripts 
     PRINT 'Deploying Qualification Specific scripts.'  
      begin transaction; 
      PRINT 'IN QUALIFICATION ENVIRONMENT POST DEPLOYMENT SCRIPT' 
      commit transaction; 
    END 
    ELSE IF ('$(DeployType)' = 'Production') 
    BEGIN --Run scripts 
     PRINT 'Deploying Production Specific scripts.' 
      begin transaction; 
      PRINT 'IN PRODUCTION ENVIRONMENT POST DEPLOYMENT SCRIPT' 
      -- TODO: Confirm this record should be deleted 
      --DELETE TB_VariableName where Id = 9514 
      commit transaction; 
    END