bin/Public/Invoke-sqmSetDatabaseRecoveryMode.ps1

<#
.SYNOPSIS
aendert den Recovery-Modus einer oder mehrerer Benutzerdatenbanken.
 
.DESCRIPTION
Die Funktion setzt den Recovery-Modus (Simple, Full, BulkLogged) fuer alle oder
ausgewaehlte Benutzerdatenbanken einer SQL Server-Instanz. Systemdatenbanken werden
automatisch ausgeschlossen.
 
Wenn kein SqlInstance-Parameter angegeben wird, wird standardmaessig der aktuelle
Computername ($env:COMPUTERNAME) verwendet. Diese Regel gilt fuer alle zukuenftigen
Versionen.
 
.PARAMETER SqlInstance
Die Ziel-SQL Server-Instanz (z.B. "localhost", "SQL01\INSTANCE").
Wenn nicht angegeben, wird der aktuelle Computername verwendet.
 
.PARAMETER SqlCredential
Alternative Anmeldeinformationen (PSCredential). Wenn nicht angegeben, wird
Windows-Authentifizierung verwendet.
 
.PARAMETER Database
Name oder Array von Benutzerdatenbanken, deren Recovery-Modus geaendert werden soll.
Wird ignoriert, wenn -All gesetzt ist.
 
.PARAMETER All
Wenn gesetzt, wird der Recovery-Modus fuer alle Benutzerdatenbanken geaendert.
 
.PARAMETER RecoveryMode
Der gewuenschte Recovery-Modus. Erlaubte Werte: Simple, Full, BulkLogged.
 
.PARAMETER EnableException
Schalter, um Ausnahmen durchzulassen (standardmaessig werden Fehler als Warnung
protokolliert).
 
.PARAMETER Confirm
Fordert vor der Ausfuehrung eine Bestaetigung an. Standardmaessig deaktiviert.
Wird an Set-DbaDbRecoveryModel weitergereicht.
 
.PARAMETER WhatIf
Zeigt, was passieren wuerde, ohne die aenderung tatsaechlich auszufuehren.
Wird an Set-DbaDbRecoveryModel weitergereicht.
 
.EXAMPLE
# Alle Benutzerdatenbanken auf Full setzen (ohne Nachfrage)
Invoke-sqmSetDatabaseRecoveryMode -All -RecoveryMode Full
 
.EXAMPLE
# Mit Nachfrage (Confirm an Set-DbaDbRecoveryModel)
Invoke-sqmSetDatabaseRecoveryMode -Database "SalesDB" -RecoveryMode Simple -Confirm
 
.NOTES
Erfordert dbatools-Modul und eine vorhandene Funktion Invoke-sqmLogging.
Systemdatenbanken werden ignoriert.
Default fuer SqlInstance: $env:COMPUTERNAME.
#>


function Invoke-sqmSetDatabaseRecoveryMode
{
    [CmdletBinding(DefaultParameterSetName = 'Specific', SupportsShouldProcess = $true, ConfirmImpact = 'None')]
    param (
        [Parameter(Mandatory = $false, Position = 0)]
        [string]$SqlInstance,
        [Parameter(Mandatory = $false)]
        [System.Management.Automation.PSCredential]$SqlCredential,
        [Parameter(Mandatory = $false, ParameterSetName = 'Specific')]
        [string[]]$Database,
        [Parameter(Mandatory = $false, ParameterSetName = 'All')]
        [switch]$All,
        [Parameter(Mandatory = $true)]
        [ValidateSet('Simple', 'Full', 'BulkLogged')]
        [string]$RecoveryMode,
        [Parameter(Mandatory = $false)]
        [switch]$EnableException
    )
    
    begin
    {
        $functionName = $MyInvocation.MyCommand.Name
        
        if (-not $PSBoundParameters.ContainsKey('SqlInstance') -or [string]::IsNullOrWhiteSpace($SqlInstance))
        {
            $SqlInstance = $env:COMPUTERNAME
            Write-Verbose "Keine SqlInstance angegeben. Verwende Standard: $SqlInstance"
        }
        
        if (-not $script:dbatoolsAvailable)
        {
            $errMsg = "dbatools-Modul nicht gefunden. Bitte installieren Sie es mit: Install-Module dbatools"
            Invoke-sqmLogging -Message $errMsg -FunctionName $functionName -Level "ERROR"
            throw $errMsg
        }
        
        Invoke-sqmLogging -Message "Starte $functionName auf Instanz: $SqlInstance. Ziel-RecoveryMode: $RecoveryMode" -FunctionName $functionName -Level "INFO"
        
        $results = @()
    }
    
    process
    {
        try
        {
            $dbParams = @{
                SqlInstance   = $SqlInstance
                SqlCredential = $SqlCredential
                ExcludeSystem = $true
                ErrorAction   = 'Stop'
            }
            if ($EnableException) { $dbParams.EnableException = $true }
            
            if ($All)
            {
                Invoke-sqmLogging -Message "Parameter -All erkannt: aendere Recovery-Modus fuer ALLE Benutzerdatenbanken." -FunctionName $functionName -Level "INFO"
                $databases = Get-DbaDatabase @dbParams | Where-Object { $_.IsAccessible }
            }
            elseif ($Database)
            {
                Invoke-sqmLogging -Message "Filtere nach angegebenen Datenbanken: $($Database -join ', ')" -FunctionName $functionName -Level "DEBUG"
                $dbParams.Database = $Database
                $databases = Get-DbaDatabase @dbParams | Where-Object { $_.IsAccessible }
                $foundDbNames = $databases | Select-Object -ExpandProperty Name
                $missing = $Database | Where-Object { $_ -notin $foundDbNames }
                if ($missing)
                {
                    $msg = "Folgende Datenbanken wurden nicht gefunden oder sind nicht zugaenglich: $($missing -join ', ')"
                    Invoke-sqmLogging -Message $msg -FunctionName $functionName -Level "WARNING"
                    $results += [PSCustomObject]@{
                        SqlInstance  = $SqlInstance
                        DatabaseName = $missing -join ','
                        CurrentMode  = $null
                        NewMode         = $RecoveryMode
                        Status         = "NotFound"
                        Message         = $msg
                    }
                }
            }
            else
            {
                $msg = "Weder -All noch -Database angegeben. Es werden keine Datenbanken geaendert."
                Invoke-sqmLogging -Message $msg -FunctionName $functionName -Level "WARNING"
                $results += [PSCustomObject]@{
                    SqlInstance  = $SqlInstance
                    DatabaseName = $null
                    CurrentMode  = $null
                    NewMode         = $RecoveryMode
                    Status         = "NoSelection"
                    Message         = $msg
                }
                return $results
            }
            
            if (-not $databases)
            {
                $msg = "Keine Benutzerdatenbanken fuer die aenderung des Recovery-Modus gefunden."
                Invoke-sqmLogging -Message $msg -FunctionName $functionName -Level "WARNING"
                $results += [PSCustomObject]@{
                    SqlInstance  = $SqlInstance
                    DatabaseName = $null
                    CurrentMode  = $null
                    NewMode         = $RecoveryMode
                    Status         = "NoDatabasesFound"
                    Message         = $msg
                }
                return $results
            }
            
            foreach ($db in $databases)
            {
                $dbName = $db.Name
                $currentMode = $db.RecoveryModel
                
                if ($currentMode -eq $RecoveryMode)
                {
                    $msg = "Datenbank '$dbName' hat bereits den Recovery-Modus '$RecoveryMode'. ueberspringe."
                    Invoke-sqmLogging -Message $msg -FunctionName $functionName -Level "VERBOSE"
                    $results += [PSCustomObject]@{
                        SqlInstance  = $SqlInstance
                        DatabaseName = $dbName
                        CurrentMode  = $currentMode
                        NewMode         = $RecoveryMode
                        Status         = "AlreadySet"
                        Message         = $msg
                    }
                    continue
                }
                
                $actionMsg = "Setze Recovery-Modus fuer Datenbank '$dbName' von '$currentMode' auf '$RecoveryMode'"
                if ($PSCmdlet.ShouldProcess($dbName, $actionMsg))
                {
                    try
                    {
                        Invoke-sqmLogging -Message $actionMsg -FunctionName $functionName -Level "INFO"
                        
                        # Dynamische Parameter fuer Set-DbaDbRecoveryModel
                        $setParams = @{
                            SqlInstance   = $SqlInstance
                            SqlCredential = $SqlCredential
                            Database      = $dbName
                            RecoveryModel = $RecoveryMode
                            Confirm       = $false
                            ErrorAction   = 'Stop'
                        }

                        Set-DbaDbRecoveryModel @setParams
                        
                        $successMsg = "Recovery-Modus fuer '$dbName' erfolgreich auf '$RecoveryMode' gesetzt."
                        Invoke-sqmLogging -Message $successMsg -FunctionName $functionName -Level "INFO"
                        $results += [PSCustomObject]@{
                            SqlInstance  = $SqlInstance
                            DatabaseName = $dbName
                            CurrentMode  = $currentMode
                            NewMode         = $RecoveryMode
                            Status         = "Success"
                            Message         = $successMsg
                        }
                    }
                    catch
                    {
                        $errMsg = "Fehler beim Setzen des Recovery-Modus fuer '$dbName': $($_.Exception.Message)"
                        Invoke-sqmLogging -Message $errMsg -FunctionName $functionName -Level "ERROR"
                        if ($EnableException) { throw }
                        $results += [PSCustomObject]@{
                            SqlInstance  = $SqlInstance
                            DatabaseName = $dbName
                            CurrentMode  = $currentMode
                            NewMode         = $RecoveryMode
                            Status         = "Failed"
                            Message         = $errMsg
                        }
                    }
                }
                else
                {
                    $skipMsg = "WhatIf: aenderung an '$dbName' uebersprungen."
                    Invoke-sqmLogging -Message $skipMsg -FunctionName $functionName -Level "VERBOSE"
                    $results += [PSCustomObject]@{
                        SqlInstance  = $SqlInstance
                        DatabaseName = $dbName
                        CurrentMode  = $currentMode
                        NewMode         = $RecoveryMode
                        Status         = "WhatIfSkipped"
                        Message         = $skipMsg
                    }
                }
            }
        }
        catch
        {
            $errMsg = "Allgemeiner Fehler: $($_.Exception.Message)"
            Invoke-sqmLogging -Message $errMsg -FunctionName $functionName -Level "ERROR"
            if ($EnableException) { throw }
            $results += [PSCustomObject]@{
                SqlInstance  = $SqlInstance
                DatabaseName = $null
                CurrentMode  = $null
                NewMode         = $RecoveryMode
                Status         = "GlobalError"
                Message         = $errMsg
            }
        }
    }
    
    end
    {
        Invoke-sqmLogging -Message "$functionName abgeschlossen. $($results.Count) Objekte zurueckgegeben." -FunctionName $functionName -Level "INFO"
        return $results
    }
}