functions/azure/Sql/Copy-AzSqlDatabase.ps1

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

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

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

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

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

        [Parameter(Mandatory = $false)]
        [int]$TimeoutSeconds = 3600,

        [Alias('ForceOverwrite')]
        [switch]$Force
    )

    # Prüfen, ob Zieldatenbank existiert
    $existingDb = Get-BcAdminAzSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $TargetDatabaseName -ErrorAction SilentlyContinue

    if ($existingDb) {
        Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Die Zieldatenbank '$TargetDatabaseName' existiert bereits."

        if (-not ($Force)) {
            $response = Read-Host "Datenbank löschen und fortfahren? (y/n)"
            if ($response -ne "y") {
                Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Abbruch durch Benutzer."
                return $false
            }
        }

        # Löschen der Datenbank
        $success = Remove-BcAdminAzSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $TargetDatabaseName -Force | Out-Null
        if (-not $success)
        {
            Write-Warning "Remove-BcAdminAzSqlDatabase failed!"
            return $false
        }

        # Auf Löschung warten
        do {
            Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Warte auf Löschung..."
            Start-Sleep -Seconds 5
            $existingDb = Get-BcAdminAzSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $TargetDatabaseName -ErrorAction SilentlyContinue
        } while ($existingDb)

        Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Datenbank erfolgreich gelöscht."
    }

    # Kopiervorgang starten
    Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Starte Kopiervorgang..."
    $copyParams = @{ 
        ResourceGroupName = $ResourceGroupName
        ServerName = $ServerName
        DatabaseName = $SourceDatabaseName
        CopyDatabaseName = $TargetDatabaseName
    }
    if (-not ([string]::IsNullOrWhiteSpace($ElasticPoolName))) {
        $copyParams += @{ ElasticPoolName = $ElasticPoolName }
    }
    $response = New-BcAdminAzSqlDatabaseCopy @copyParams

    if ($null -eq $response) {
        Write-Warning "New-BcAdminAzSqlDatabaseCopy response IS NULL!"
        return $false
    }

    Write-Verbose "New-BcAdminAzSqlDatabaseCopy response: $response"

    # Auf Abschluss warten
    $waitresponse = Wait-BcAdminAzOperation -OperationUri $response.Headers.Location[0] -PollIntervalSeconds ([int]$response.Headers.'Retry-After'[0]) -TimeoutSeconds $TimeoutSeconds
    if (-not $waitresponse)
    {
        Write-Warning "Kopiervorgang fehlgeschlagen oder noch nicht abgeschlossen. Warten abgebrochen"
        return $false
    }

    Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Kopiervorgang abgeschlossen. Die Datenbank '$TargetDatabaseName' ist jetzt online."

    $newDatabase = Get-BcAdminAzSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $TargetDatabaseName
    return $newDatabase
}
Set-Alias -Name Copy-AzSqlDatabase -Value Copy-BcAdminAzSqlDatabase -Description 'Prevent breaking scripts using Copy-AzSqlDatabase after function has been renamed (2025-06-09).'