2017-10-31 11 views
0

SQL Server 데이터베이스 프로젝트 (Dacpac)에서 데이터베이스 참조를 런타임에 파생시킬 수있는 방법이 있습니까?SSDT (dacpac) 프로젝트의 동적 데이터베이스 참조

우리는 Dacpac을 사용하여 데이터베이스 개체를 배포하는 제품을 만들고 있습니다.

또한 제품 구현 팀은 데이터베이스 참조를 제품 Dacpac 파일에 추가 한 다음 자체 추가 개체를 프로젝트에 추가하여 Dacpac 프로젝트를 사용합니다.

우리가 직면 한 문제는 구현시 최신 제품 릴리스 버전을 가리켜 야 할 때마다 구현 dacpac에서 상위 dacpac 참조를 수동으로 변경해야 새로운 제품의 새로운 파일 경로를 참조 할 수 있습니다 dacpac (최신 릴리스에서). 우리는 각 구현에서 여러 구현 팀과 여러 데이터베이스 프로젝트를 수행했습니다.

데이터베이스 프로젝트에서 데이터베이스 참조 (* .dacpac)가 런타임에 변수 또는 매개 변수 또는 그 종류의 것을 사용하여 파생 될 수있는 방법이 있습니까?

+1

dacpacs를 공유 위치 –

+0

에 넣기 만하면됩니다. 프로젝트를 배포 할 때 항상 최신 dacpac을 배포하거나 구현 프로젝트를 빌드 할 때 일부 비트가있는 dacpac에 대해 빌드하려는 경우를 의미합니까? 누락 (이전 릴리스에서)? –

+0

Dmitrij의 의견은 우리가하는 일과 거의 같습니다. 적절한 버전의 dacpac을 빌드하고 공유 위치에 두십시오. 필요에 따라 버전 관리를하고 모든 것이 제대로 작동하기 위해 어떤 빌드가 필요한지 메모하십시오.이상적으로 참조는 ".. \ .. \ .. \ Schema \ DB1.dacpac"또는 이와 유사한 어떤 공통 경로에 있어야하므로 모든 프로젝트에 관계없이 동일합니다. –

답변

0

다음과 같이 질문의 나의 이해는 다음과 같습니다

당신은 저장 프로 시저 및 기타 DB 개체 (아래 # 1과 유사) 데이터베이스 참조가 그 (아래 예제 이미지 참조) SSDT 데이터베이스 프로젝트가 그 참조 데이터베이스에 액세스하십시오 (파일 # 2 및 코드 # 3과 유사). DACPac을 구현 한 솔루션을 구축했으며 이제이 DACPac을 활용하고 배포시 다른 데이터베이스를 참조하려고합니다. 바라기를 나는 당신의 질문을 정확하게 이해했다.

그렇다면 프로필 게시 기능을 사용하여이를 달성 할 수 있습니다 (아래 # 4와 유사).

enter image description here

이 코드는 내 SSDT talk github project에서 내 노트에서 볼 수 있습니다. demo04 솔루션 파일을 자세히 보면 DEV_MJE.deploy.ps1 PowerShell 파일과 DEV_MJE2.deploy.ps1 파일이 있음을 알 수 있습니다. 이 스크립트는 MSBuild를 실행하여 DACPac을 구축 한 다음 SqlPackage를 사용하여 각각 DEV_MJE.publish.xml 또는 DEV_MJE2.publish.xml을 게시합니다. 컴퓨터에서이 예제를 실행하는 경우 경로에 MSBuild.exeSqlPackage.exe을 추가하고 xml 파일의 TargetConnectionString을 기존 개발 데이터베이스로 수정해야합니다. 이 작동하는 방법의 예 ... 나는 프로필 DEV_MJE.publish.xml 게시를 사용하는 경우, 결과 GetDataFromAnotherTable.sql 파일이 포함로

:

나는 결과 GetDataFromAnotherTable.sql 파일이 포함 DEV_MJE2.publish.xml를 사용할 때 반면
SELECT [SomeData] FROM [AnotherDb_MJE].[dbo].[AnotherTable] 

:

SELECT [SomeData] FROM [AnotherDb_MJE2].[dbo].[AnotherTable] 

공지 번째의 데이터베이스 참조 AnotherDb_MJE 2 바뀌었다.

게시 프로필이 DACPac 및 SSDT 데이터베이스 프로젝트와 어떤 관련이 있는지 보려면 web page을 참조하십시오. SqlPackage.exe 이상의 다른 배포 방법에 대한 정보도 포함되어 있습니다.다른

뭔가 버전 제어에 파일 경로를 사용하는 것은 DACPac 정말 가장 좋은 방법이 아니라고,

주를 고려해야한다. DACPac 아티팩트는 .Net DLL과 유사하게 간주됩니다. 그것은 빌드의 양품입니다.

이와 같이 더 나은 방법은 NuGet과 Octopus Deploy와 같은 도구를 사용하여 DACPac을 저장, 추적 및 배포하는 것입니다. 이 작동 방식에 대한 자세한 설명은 stackoverflow answer을 참조하십시오. 이 도움이

희망,

마이클

0

덕분에 후속 코멘트, 당신이 작성하고 코드가 프로젝트에 따라 다른 dacpacs을 사용할 수 있도록 배포 할 때 당신은 무엇을하려고하는 것은 생각 ?

각 구현 팀은 다른 버전의 공유 dacpac을 배포 할 수 있으므로 공유 위치에 파일을 저장하고 dacpac "Product_Latest.dacpac"또는 다른 제품을 호출 할 수 없으므로 모든 사람이 항상 최신 버전을 가져옵니다.

".sqlproj"파일은 표준 msbuild 스크립트이며 참조는 msbuild 속성을 사용하여 관리 할 수 ​​있으므로 런타임에 기술적으로 참조를 변경할 수 있습니다. 당신이 당신의 .sqlproj 파일을 편집하고 처음 <PropertyGroup> 태그에 속성을 추가 할 경우, 내가 사용 :

<ProdDacpacVersion Condition="'$(ProdDacpacVersion)' == ''">v1</ProdDacpacVersion>

V1이 버전 폴더에 대한 고유 한 이름 - 당신은 당신이 원하는 dacpac를 식별하기 위해 뭔가를해야합니다.

이 속성은 TargetDatabaseSet 및 IncludeCompositeObjects 바로 뒤에 있습니다.

당신은 그하여 dacpac 참조 대신

<ArtifactReference Include="..\..\..\..\..\Desktop\prod\v1\Database2.dacpac"> <HintPath>..\..\..\..\..\Desktop\prod\v1\Database2.dacpac</HintPath> <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors> </ArtifactReference>

를 사용하여 위의 재산을 찾을 경우

<ArtifactReference Include="..\..\..\..\..\Desktop\prod\$(ProdDacpacVersion)\Database2.dacpac"> <HintPath>..\..\..\..\..\Desktop\prod\$(ProdDacpacVersion)\Database2.dacpac</HintPath> <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors> </ArtifactReference>

그런 다음 참조가를 얻을 수있는 속성을 사용됩니다 dacpac의 경로입니다. 속성을 설정할 수있는 몇 가지 방법이 있습니다. 파일이나 환경 변수 또는 다른 속성에서 새 버전의 속성을 읽으려는 경우 .sqlproj 파일을 편집 할 수 있습니다 (msbuild 재미를 그대로 두겠습니다). . 그것은 오래 걸리지 않을 것이며, 그것은

당신이 dacpac 년대를 배포 : 저주를 많이 절약 할 수 -

나는, 표준으로, 매번 참조 프로젝트를 다시로드 또는 Visual Studio를 다시 시작하거나 변경 한 것 배포는 먼저 동일한 폴더에서 참조를 찾습니다. 따라서 배포 할 때 올바른 폴더를 bin 폴더에 복사하십시오.