通过power shell脚本将Dacpac软件包部署到Azure SQL Server

时间:2017-02-28 03:02:55

标签: powershell azure-sql-database azure-devops azure-pipelines dacpac

我尝试使用PowerShell脚本在单个构建过程中部署多个dacpac。

param(
    [string]$publish_profile,
    [string]$path_to_snapshots,
    [string]$password 
)

#Load Microsoft.SqlServer.Dac assembly
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Dac")

#Load Dac profile 
$dacProfile = [Microsoft.SqlServer.Dac.DacProfile]::Load($publish_profile)
$dacService = new-object Microsoft.SqlServer.Dac.DacServices($dacProfile.TargetConnectionString)

$files = Get-ChildItem  "$path_to_snapshots\*.dacpac"
foreach ($file in $files) 
{
    $fileName = $file.Name 
    Try
    {
            $dp = [Microsoft.SqlServer.Dac.DacPackage]::Load($file.FullName)
            $dacService.Deploy($dp, $database, $true) 
        }
    }
    Catch
    {
        Write-Host "$fileName deployment has been failed"  -foregroundcolor "red"
        throw $_.Exception;
        Break
    }
}

在我的本地环境中,一切都运行良好,但在Visual Studio团队服务的构建过程中,我收到错误:

  

2017-02-24T06:03:09.7955300Z *********.dacpac部署失败了   2017-02-24T06:03:09.9785258Z ## [错误]异常调用"部署"用" 3"参数:"无法部署包。"
  在D:\ a \ 1 \ s ******************** \ deploydatabase.ps1:104 char:13
  + $ dacService.Deploy($ dp,$ database,$ true)
  + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   + CategoryInfo:NotSpecified:(:) [],ParentContainsErrorRecordException
  + FullyQualifiedErrorId:DacServicesException

     

2017-02-24T06:03:10.0085256Z ## [错误]进程已完成,退出代码为1,并且已将1个错误写入错误流。

1 个答案:

答案 0 :(得分:3)

首先,您需要添加防火墙规则才能连接到Azure SQL Server。

  1. 修改您的构建定义
  2. 选择“选项”选项卡,然后选中“允许脚本访问OAuth令牌”
  3. 添加Azure PowerShell步骤(参数:-RestAddress https://[account].vsdtl.visualstudio.com/DefaultCollection/_apis/vslabs/ipaddress -Token $(System.AccessToken)-RG [资源组] -Server [服务器名称] -ruleName $(Build.BuildNumber)
  4. 代码:

    param (
        [string]$RestAddress,
        [string]$Token,
        [string]$RG,
        [string]$Server
        )
    $basicAuth = ("{0}:{1}" -f 'test',$Token)
    $basicAuth = [System.Text.Encoding]::UTF8.GetBytes($basicAuth)
    $basicAuth = [System.Convert]::ToBase64String($basicAuth)
    $headers = @{Authorization=("Basic {0}" -f $basicAuth)}
    $result = Invoke-RestMethod -Uri $RestAddress -headers $headers -Method Get
    Write-Host $result.value
    New-AzureRmSqlServerFirewallRule -ResourceGroupName $RG -ServerName $Server -FirewallRuleName "UnitTestRule" -StartIpAddress "$($result.value)" -EndIpAddress "$($result.value)"        
    

    其次,我建议您使用此包中的程序集: Microsoft.SqlServer.Dac

    第三,要获得详细错误,您可以改为使用此代码:

    Catch
        {
            Write-Host "$fileName deployment has been failed"  -foregroundcolor "red"
             $Error | format-list -force
            Write-Host $Error[0].Exception.ParentContainsErrorRecordException;
            Break
        }
    

    另一方面,我建议您可以通过SqlPackage.exe部署SQL包。