Verwenden der SQL-Bewertungs-API für SQL Server für Linux

Gilt für:SQL Server unter Linux

Die SQL Assessment API bietet einen Mechanismus, um die Konfiguration von SQL Server für Best Practices zu evaluieren. Die API umfasst einen vordefinierten Regelsatz, der vom SQL Server-Team empfohlene Best Practices enthält. Dieser Regelsatz wird mit der Veröffentlichung von neuen Versionen erweitert. Er ist praktisch, da Sie damit sicherstellen können, dass Ihre SQL Server-Konfiguration den empfohlenen Best Practices entspricht.

Das von Microsoft ausgelieferte Regelwerk ist auf GitHub verfügbar. Sie können den gesamten Regelsatz im Beispielrepository anzeigen.

In diesem Artikel verwenden Sie PowerShell, um die SQL Assessment API für SQL Server für Linux und Container auszuführen.

Voraussetzungen

  1. Stellen Sie sicher, dass Sie PowerShell unter Linux installieren.

  2. Installieren Sie das PowerShell-Modul SqlServer aus dem PowerShell-Katalog, das als mssql-Benutzer ausgeführt wird.

    su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
    

Einrichten der Bewertung

Die SQL Assessment API liefert Ausgaben im JSON-Format. Um die SQL Assessment API zu konfigurieren, führen Sie die folgenden Schritte aus:

  1. Erstelle einen Login für SQL Server-Bewertungen mit SQL-Authentifizierung in der Instanz, die du bewerten möchtest. Verwenden Sie das folgende Transact-SQL Skript, um einen Login und ein starkes Passwort zu erstellen. Ihr Kennwort sollte der standardmäßigen Kennwortrichtlinie von SQL Server folgen. Ein Standardkennwort enthält mindestens acht Zeichen, die aus drei der folgenden vier Kategorien stammen müssen: Großbuchstaben, Kleinbuchstaben, Grundzahlen (0–9) und Symbole. Kennwörter können bis zu 128 Zeichen lang sein. Verwenden Sie möglichst lange und komplexe Kennwörter.

    USE [master];
    GO
    
    CREATE LOGIN [assessmentLogin]
        WITH PASSWORD = N'<password>';
    
    GRANT CONTROL SERVER TO [assessmentLogin];
    GO
    

    Die Erlaubnis CONTROL SERVER funktioniert für die meisten Bewertungen. Allerdings benötigen einige Bewertungen möglicherweise Systemadministratorrechte . Wenn du diese Bewertungen nicht durchführst, nutze CONTROL SERVER Berechtigungen.

  2. Speichere die Zugangsdaten für die Verbindung zur Instanz. Ersetzen Sie <password> durch das Passwort, das Sie im vorherigen Schritt verwendet haben.

    echo "assessmentLogin" > /var/opt/mssql/secrets/assessment
    echo "<password>" >> /var/opt/mssql/secrets/assessment
    
  3. Sichern Sie die neuen Anmeldeinformationen für die Bewertung, indem Sie sicherstellen, dass nur der mssql-Benutzer auf die Anmeldeinformationen zugreifen kann.

    chmod 600 /var/opt/mssql/secrets/assessment
    chown mssql:mssql /var/opt/mssql/secrets/assessment
    

Herunterladen des Bewertungsskripts

Das folgende Beispielskript ruft die SQL Assessment API mit den in den vorherigen Schritten erstellten Zugangsdaten auf. Das Skript erzeugt JSON-Ausgaben im Verzeichnis /var/opt/mssql/log/assessments .

Hinweis

Die SQL-Bewertungs-API kann auch Ausgaben in CSV- und XML-Formaten generieren.

Das Skript steht auf GitHub als Download zur Verfügung.

Sie können diese Datei als /opt/mssql/bin/runassessment.ps1 speichern.

[CmdletBinding()] param ()

$Error.Clear()

# Create output directory if not exists

$outDir = '/var/opt/mssql/log/assessments'
if (-not ( Test-Path $outDir )) { mkdir $outDir }
$outPath = Join-Path $outDir 'assessment-latest'

$errorPath = Join-Path $outDir 'assessment-latest-errors'
if ( Test-Path $errorPath ) { remove-item $errorPath }

function ConvertTo-LogOutput {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)]
        $input
    )
    process {
        switch ($input) {
            { $_ -is [System.Management.Automation.WarningRecord] } {
                $result = @{
                    'TimeStamp' = $(Get-Date).ToString("O");
                    'Warning'   = $_.Message
                }
            }
            default {
                $result = @{
                    'TimeStamp'      = $input.TimeStamp;
                    'Severity'       = $input.Severity;
                    'TargetType'     = $input.TargetType;
                    'ServerName'     = $serverName;
                    'HostName'       = $hostName;
                    'TargetName'     = $input.TargetObject.Name;
                    'TargetPath'     = $input.TargetPath;
                    'CheckId'        = $input.Check.Id;
                    'CheckName'      = $input.Check.DisplayName;
                    'Message'        = $input.Message;
                    'RulesetName'    = $input.Check.OriginName;
                    'RulesetVersion' = $input.Check.OriginVersion.ToString();
                    'HelpLink'       = $input.HelpLink
                }

                if ( $input.TargetType -eq 'Database') {
                    $result['AvailabilityGroup'] = $input.TargetObject.AvailabilityGroupName
                }
            }
        }

        $result
    }
}

function Get-TargetsRecursive {

    [CmdletBinding()]
    Param (
        [Parameter(ValueFromPipeline = $true)]
        [Microsoft.SqlServer.Management.Smo.Server] $server
    )

    $server
    $server.Databases
}

function Get-ConfSetting {
    [CmdletBinding()]
    param (
        $confFile,
        $section,
        $name,
        $defaultValue = $null
    )

    $inSection = $false

    switch -regex -file $confFile {
        "^\s*\[\s*(.+?)\s*\]" {
            $inSection = $matches[1] -eq $section
        }
        "^\s*$($name)\s*=\s*(.+?)\s*$" {
            if ($inSection) {
                return $matches[1]
            }
        }
    }

    return $defaultValue
}

try {
    Write-Verbose "Acquiring credentials"

    $login, $pwd = Get-Content '/var/opt/mssql/secrets/assessment' -Encoding UTF8NoBOM -TotalCount 2
    $securePassword = ConvertTo-SecureString $pwd -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential ($login, $securePassword)
    $securePassword.MakeReadOnly()

    Write-Verbose "Acquired credentials"

    $serverInstance = '.'

    if (Test-Path /var/opt/mssql/mssql.conf) {
        $port = Get-ConfSetting /var/opt/mssql/mssql.conf network tcpport

        if (-not [string]::IsNullOrWhiteSpace($port)) {
            Write-Verbose "Using port $($port)"
            $serverInstance = "$($serverInstance),$($port)"
        }
    }

    # IMPORTANT: If the script is run in trusted environments and there is a prelogin handshake error,
    # add -TrustServerCertificate flag in the commands for $serverName, $hostName and Get-SqlInstance lines below.
    $serverName = (Invoke-SqlCmd -ServerInstance $serverInstance -Credential $credential -Query "SELECT @@SERVERNAME")[0]
    $hostName = (Invoke-SqlCmd -ServerInstance $serverInstance -Credential $credential -Query "SELECT HOST_NAME()")[0]

    # Invoke assessment and store results.
    # Replace 'ConvertTo-Json' with 'ConvertTo-Csv' to change output format.
    # Available output formats: JSON, CSV, XML.
    # Encoding parameter is optional.

    Get-SqlInstance -ServerInstance $serverInstance -Credential $credential -ErrorAction Stop
    | Get-TargetsRecursive
    | ForEach-Object { Write-Verbose "Invoke assessment on $($_.Urn)"; $_ }
    | Invoke-SqlAssessment 3>&1
    | ConvertTo-LogOutput
    | ConvertTo-Json -AsArray
    | Set-Content $outPath -Encoding UTF8NoBOM
}
finally {
    Write-Verbose "Error count: $($Error.Count)"

    if ($Error) {
        $Error
        | ForEach-Object { @{ 'TimeStamp' = $(Get-Date).ToString("O"); 'Message' = $_.ToString() } }
        | ConvertTo-Json -AsArray
        | Set-Content $errorPath -Encoding UTF8NoBOM
    }
}

Hinweis

Wenn du dieses Skript in vertrauenswürdigen Umgebungen ausführst und einen Prelogin-Handshake-Fehler erhältst, füge die Flagge -TrustServerCertificate in die Befehle für $serverName, $hostName, und Get-SqlInstance Zeilen im Code hinzu.

Bewertung ausführen

  1. Stelle sicher, dass der mssql Benutzer das Skript besitzt und ausführen kann.

    chown mssql:mssql /opt/mssql/bin/runassessment.ps1
    chmod 700 /opt/mssql/bin/runassessment.ps1
    
  2. Erstelle einen Log-Ordner und gib dem mssql Benutzer Berechtigungen für diesen Ordner.

    mkdir /var/opt/mssql/log/assessments/
    chown mssql:mssql /var/opt/mssql/log/assessments/
    chmod 0700 /var/opt/mssql/log/assessments/
    
  3. Du kannst jetzt deine erste Bewertung als mssql Nutzer erstellen. Assessments als dieser Nutzer durchzuführen ist sicherer, besonders wenn Sie spätere Assessments automatisch über cron oder systemddurchführen.

    su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"
    
  4. Wenn der Befehl beendet ist, erzeugt er die Ausgabe im JSON-Format. Du kannst diese Ausgabe mit jedem Tool verwenden, das das Parsen von JSON-Dateien unterstützt, einschließlich Visual Studio Code.