그래서 PowerShell을 사용하기로 결정했습니다 (실제로는 스크립트가 많기 때문에) Client DAC 만 사용하십시오. 예제 here은 매우 유용했습니다.
MSBuild Extension Pack을 사용하면 PowerShell 표준어를 래핑하는 작업을 만들 수 있습니다.
DAC 3.0에 액세스하려면 PowerShell 3을 설치해야하며 Windows 관리 프레임 워크 3.0을 설치하는 것이 가장 좋습니다.
TaskFactory 래퍼 다음과 같이 다음과 같이 보일 것이다 이러한 래퍼를 호출 할
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This custom task encapsulates DAC Framework 3.0 BACPAC import and export routines,
which are compatible with SQL Server 2012 and later, and SQL Azure -->
<!-- Required Import to use MSBuild Extension Pack -->
<PropertyGroup>
<AssemblyFile>$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.TaskFactory.PowerShell.dll</AssemblyFile>
<SqlServerDacDll>C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\Microsoft.SqlServer.Dac.dll</SqlServerDacDll>
</PropertyGroup>
<UsingTask TaskFactory="PowershellTaskFactory" TaskName="ExportBacpac" AssemblyFile="$(AssemblyFile)">
<ParameterGroup>
<ConnectionString Required="true" ParameterType="System.String" />
<BacpacFile Required="true" ParameterType="System.String" />
<DatabaseName Required="true" ParameterType="System.String" />
</ParameterGroup>
<Task>
<![CDATA[
#write progress to activity log
$log.LogMessage([Microsoft.Build.Framework.MessageImportance]"High","Starting export of database '$databasename' to '$bacpacfile' with connection string '$connectionstring' ")
# load in DAC DLL (requires config file to support .NET 4.0)
# change file location for a 32-bit OS
add-type -path "$(SqlServerDacDll)"
# make DacServices object, needs a connection string
$d = new-object Microsoft.SqlServer.Dac.DacServices $connectionstring
# register events, if you want 'em
register-objectevent -in $d -eventname Message -source "msg" -action { $log.LogMessage([Microsoft.Build.Framework.MessageImportance]"High", $Event.SourceArgs[1].Message.Message) }
# Export schema and data from database $databasename
$d.exportbacpac($bacpacfile, $databasename)
# clean up event
unregister-event -source "msg"
$log.LogMessage([Microsoft.Build.Framework.MessageImportance]"High","Completed export of database '$databasename' to '$bacpacfile'")
]]>
</Task>
</UsingTask>
<UsingTask TaskFactory="PowershellTaskFactory" TaskName="ImportBacpac" AssemblyFile="$(AssemblyFile)">
<ParameterGroup>
<ConnectionString Required="true" ParameterType="System.String" />
<BacpacFile Required="true" ParameterType="System.String" />
<DatabaseName Required="true" ParameterType="System.String" /><!-- Not relevant for Azure import, which uses the Bacpac file name as the database name -->
</ParameterGroup>
<Task>
<![CDATA[
#write progress to activity log
$log.LogMessage([Microsoft.Build.Framework.MessageImportance]"High","Starting import of database '$databasename' from '$bacpacfile' with connection string '$connectionstring' ")
# load in DAC DLL (requires config file to support .NET 4.0)
# change file location for a 32-bit OS
add-type -path "$(SqlServerDacDll)"
# make DacServices object, needs a connection string
$d = new-object Microsoft.SqlServer.Dac.DacServices $connectionstring
# register events, if you want 'em
register-objectevent -in $d -eventname Message -source "msg" -action { $log.LogMessage([Microsoft.Build.Framework.MessageImportance]"High", $Event.SourceArgs[1].Message.Message) }
# Load bacpac from file & import to database named $databasename
$bp = [Microsoft.SqlServer.Dac.BacPackage]::Load($bacpacfile)
$d.importbacpac($bp, $databasename)
# clean up event
unregister-event -source "msg"
$log.LogMessage([Microsoft.Build.Framework.MessageImportance]"High","Completed import of database '$databasename' from '$bacpacfile'")
]]>
</Task>
</UsingTask>
</Project>
샘플 대상 :
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="BacpacImportExport.xml"/>
<PropertyGroup>
<TempBacpacFile>$(ReleaseFolderPublish)\$(DestinationDBName).bacpac</TempBacpacFile>
</PropertyGroup>
<Target Name="CopyAndReplaceDatabaseViaBacpac">
<Message Text="Clean bacpac directory"/>
<Exec Command="mkdir $(ReleaseFolderPublish)\" IgnoreExitCode="true"></Exec>
<Exec Command="del /Q $(ReleaseFolderPublish)\*.bacpac " IgnoreExitCode="true"></Exec>
<MSBuild Projects="$(MSBuildProjectFile)" Targets="ReportBuildProgress" Properties="Message=Exporting database to BACPAC from source"/>
<ExportBacpac
ConnectionString="$(SourceConnectionString)"
BacpacFile="$(TempBacpacFile)"
DatabaseName="$(SourceDBName)"
/>
<MSBuild Projects="$(MSBuildProjectFile)" Targets="ReportBuildProgress" Properties="Message=Dropping database from destination (does not fail on error)"/>
<MSBuild.ExtensionPack.SqlServer.SqlCmd TaskAction="Execute" Server="$(DestinationDBServer)" Database="master"
LogOn="$(DestinationDBUser)" Password="$(DestinationDBPass)"
CommandLineQuery="DROP DATABASE [$(DestinationDBName)];"
RedirectStandardError="true" SeverityLevel="1" />
<MSBuild Projects="$(MSBuildProjectFile)" Targets="ReportBuildProgress" Properties="Message=Importing database from BACPAC to destination"/>
<ImportBacpac
ConnectionString="$(DestinationConnectionString)"
BacpacFile="$(TempBacpacFile)"
DatabaseName="$(DestinationDBName)"
/>
</Target>
</Project>
이 쉽게를 통해 참조 구현 console app를 호출하여 Hosted DAC를 사용하도록 수정 될 수있다 <ImportBacpac />
대신 <Exec Command="" />
을 호출하십시오.
개선 사항이 있으면 알려주세요.