Ошибка при экспорте базы данных SQL Azure в хранилище BLOB-объектов с помощью PowerShell

Я пытаюсь использовать API управления Azure для экспорта базы данных SQL в файл bacpac в хранилище BLOB-объектов. Процесс кажется довольно простым: получить токен, а затем:

$sqlAzureBackupHeaders = @{
    Authorization = "Bearer $accessToken"
}

$sqlAzureBackupParams = @{
    storageKey =  "<key-goes-here>",
    storageUri =  "http://mystorageacct.blob.core.windows.net/my-blob-container/export-name.bacpac",
    storageKeyType =  "StorageAccessKey",
    administratorLogin =  "<sql-user>",
    administratorLoginPassword =  "<sql-password>",
    authenticationType =  "SQL"
}

$sqlAzureApiUri = "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Sql/servers/<server-name>/databases/<database-name>/export?api-version=2014-04-01"
Invoke-RestMethod -Uri $sqlAzureApiUri -Method Post -Headers $sqlAzureBackupHeaders -Body $sqlAzureBackupParams

Это приводит к ошибке:

Invoke-RestMethod : Receivera:InternalServiceFaultThe server was unable to process the request due to an internal error.  For more 
information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the 
&lt;serviceDebug&gt; configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing 
as per the Microsoft .NET Framework SDK documentation and inspect the server trace logs.
At D:\Users\protec-admin\Desktop\run-backups.ps1:140 char:1
+ Invoke-RestMethod -uri $sqlAzureApiUri -Method Post -Headers $sqlAzur ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

Я попытался использовать Invoke-WebRequest и преобразовать тело в строку json - с тем же результатом.

Когда я пытаюсь выполнить тот же вызов с помощью Postman, он работает нормально, поэтому что-то с вызовом из powershell работает неправильно.

Как я могу заставить это работать из powershell?


person Aleks G    schedule 18.05.2020    source источник
comment
В какой среде вы получаете это? Я думаю, что Invoke-WebRequest по умолчанию требует IE. Вы можете обойти это с помощью параметра -UseBasicParsing.   -  person PEK    schedule 18.05.2020
comment
Добавьте -debug, чтобы получить подробное сообщение об ошибке.   -  person Jim Xu    schedule 19.05.2020


Ответы (1)


Согласно моему тесту, остальные API просто принимают тело json. Пожалуйста, используйте ConvertTo-Json для преобразования тела в json.

Например

$headers=@{"Authorization" = "Bearer "+$token}
$body=@{
  "storageKeyType"= "StorageAccessKey";
  "storageKey"= "<your storage account access key>";
  "storageUri"= "https://blobstorage0516.blob.core.windows.net/sample/testbacpac2.bacpac";
  "administratorLogin"= "<SQL admin>";
  "administratorLoginPassword"= "<SQL admin passsword>";
  "authenticationType"= "SQL"
}|ConvertTo-Json
$sqlAzureApiUri = "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Sql/servers/<server-name>/databases/<database-name>/export?api-version=2014-04-01"
Invoke-RestMethod -Method Post -Uri $uri -Headers $headers -Body $body -UseBasicParsing -ContentType "application/json"

введите здесь описание изображения

person Jim Xu    schedule 19.05.2020