functions/azure/Sql/New-BcAdminAzSqlDatabaseCopy.ps1

function New-BcAdminAzSqlDatabaseCopy {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$ResourceGroupName,

        [Parameter(Mandatory = $true)]
        [string]$ServerName,

        [Parameter(Mandatory = $true)]
        [Alias('DatabaseName')]
        [string]$SourceDatabaseName,

        [Parameter(Mandatory = $true)]
        [string]$CopyDatabaseName,

        [Parameter(Mandatory = $false)]
        [string]$ElasticPoolName,

        [Parameter(Mandatory = $false)]
        [string]$ApiVersion = $BcAdminSession.AzureRestApiVersion
    )

    if (-not (Connect-ToAzure)) {
        Write-Warning "Not connected to Microsoft Azure! Plase run Connect-ToAzure first!"
        return $false
    }

    $headers = @{
        Authorization = $BcAdminSession.AzureRequestHeaderAuthorization
        "Content-Type" = "application/json"
    }

    $uri = "https://management.azure.com/subscriptions/$($BcAdminSession.AzureSubscriptionId)/resourceGroups/$ResourceGroupName/providers/Microsoft.Sql/servers/$ServerName/databases/$($CopyDatabaseName)?api-version=$ApiVersion"

    $body = @{
        location = Get-BcAdminAzSqlDatabaseLocation -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $SourceDatabaseName -ApiVersion $ApiVersion
        properties = @{
            createMode = "Copy"
            sourceDatabaseId = "/subscriptions/$($BcAdminSession.AzureSubscriptionId)/resourceGroups/$ResourceGroupName/providers/Microsoft.Sql/servers/$ServerName/databases/$SourceDatabaseName"
        }
    }

    if ($ElasticPoolName) {
        $body.properties.elasticPoolId = "/subscriptions/$($BcAdminSession.AzureSubscriptionId)/resourceGroups/$ResourceGroupName/providers/Microsoft.Sql/servers/$ServerName/elasticPools/$ElasticPoolName"
    }

    try {
        Write-Verbose "Copy database '$SourceDatabaseName' as '$CopyDatabaseName'."
        $response = Invoke-WebRequest -Uri $uri -Headers $headers -Method Put -Body ($body | ConvertTo-Json)
        return $response
    }
    catch {
        if ($null -ne $_.ErrorDetails.Message) {
            try {
                $response = $_.ErrorDetails.Message | ConvertFrom-Json
                Write-Warning "$($response.error.code)`n$($response.error.Message)"
                return $false
            }
            catch {
                Write-Warning $_
                return $false
            }
        }
    }
}