functions/azure/Copy-AzSqlDatabase.ps1

function Copy-AzSqlDatabase {
    param (
        [Parameter(Mandatory)]
        [string]$ResourceGroupName,

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

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

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

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

        [switch]$ForceOverwrite
    )

    # Prüfen, ob Zieldatenbank existiert
    $existingDb = Get-AzSqlDatabase -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 ($ForceOverwrite)) {
            $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
            }
        }

        # Löschen der Datenbank
        Remove-AzSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $TargetDatabaseName -Force | Out-Null

        # Auf Löschung warten
        do {
            Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Warte auf Löschung..."
            Start-Sleep -Seconds 5
            $existingDb = Get-AzSqlDatabase -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..."
    New-AzSqlDatabaseCopy `
        -ResourceGroupName $ResourceGroupName `
        -ServerName $ServerName `
        -DatabaseName $SourceDatabaseName `
        -CopyDatabaseName $TargetDatabaseName `
        -ElasticPoolName $ElasticPoolName | Out-Null

    # Auf Abschluss warten
    do {
        Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Warte auf Abschluss des Kopiervorgangs..."
        Start-Sleep -Seconds 10
        $status = Get-AzSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $TargetDatabaseName -ErrorAction SilentlyContinue
        $state = $status.Status
        Write-Host "[$((Get-Date).ToString('HH:mm:ss'))] Aktueller Status: $state"
    } while ($state -ne "Online")

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