powershell azure-sql-database vsts vsts-build dacpac

powershell - Despliegue los paquetes de Dacpac a través de la secuencia de comandos Power Shell a Azure SQL Server



azure-sql-database vsts (1)

Estoy tratando de implementar múltiples dacpac durante el proceso de compilación único mediante el uso de secuencias de comandos de PowerShell.

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 } }

En mi entorno local, todo funciona bien, pero durante el proceso de compilación en los servicios del equipo de Visual Studio recibo un error:

2017-02-24T06: 03: 09.7955300Z *********. La implementación de dacpac ha fallado
2017-02-24T06: 03: 09.9785258Z ## [error] Llamada de excepción "Implementar" con "3" argumento (s): "No se pudo implementar el paquete".
En 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 ## [error] Proceso completado con el código de salida 1 y con 1 error (es) escritos en la secuencia de error.


En primer lugar, debe agregar una regla de firewall para conectarse a Azure SQL Server.

  1. Edita tu definición de construcción
  2. Seleccione la pestaña Opción y marque Permitir que los scripts accedan al token OAuth
  3. Agregue el paso de Azure PowerShell (argumentos: -RestAddress https: // [cuenta] .vsdtl.visualstudio.com / DefaultCollection / _apis / vslabs / ipaddress -Token $ (System.AccessToken) -RG [grupo de recursos] -Servidor [nombre del servidor] -ruleName $ (Build.BuildNumber)

Código:

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)"

En segundo lugar, le recomiendo que use el ensamblado en este paquete: Microsoft.SqlServer.Dac .

En tercer lugar, para obtener el error de detalle, puede usar este código en su lugar:

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

Por otro lado, le recomiendo que pueda implementar el paquete SQL a través de SqlPackage.exe .