Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Stellen Sie sicher, dass Sie PowerShell unter Linux installieren.
Installieren Sie das PowerShell-Modul
SqlServeraus dem PowerShell-Katalog, das alsmssql-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:
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]; GODie Erlaubnis
CONTROL SERVERfunktioniert für die meisten Bewertungen. Allerdings benötigen einige Bewertungen möglicherweise Systemadministratorrechte . Wenn du diese Bewertungen nicht durchführst, nutzeCONTROL SERVERBerechtigungen.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/assessmentSichern 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
Stelle sicher, dass der
mssqlBenutzer das Skript besitzt und ausführen kann.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Erstelle einen Log-Ordner und gib dem
mssqlBenutzer 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/Du kannst jetzt deine erste Bewertung als
mssqlNutzer erstellen. Assessments als dieser Nutzer durchzuführen ist sicherer, besonders wenn Sie spätere Assessments automatisch übercronodersystemddurchführen.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"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.