Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server op Linux
De SQL Assessment API biedt een mechanisme om de configuratie van SQL Server te evalueren voor best practices. De API wordt geleverd met een regelset met aanbevolen procedures van het SQL Server-team. Deze regelset is verbeterd met de release van nieuwe versies. Het is nuttig om te controleren of uw SQL Server-configuratie in overeenstemming is met de aanbevolen procedures.
De door Microsoft uitgebrachte regelset is beschikbaar op GitHub. U kunt de hele regelset bekijken in de opslagplaats met voorbeelden.
Gebruik in dit artikel PowerShell om de SQL Assessment API voor SQL Server on Linux en containers uit te voeren.
Vereiste voorwaarden
Zorg ervoor dat u PowerShell installeert in Linux.
Installeer de
SqlServerPowerShell-module vanuit de PowerShell Gallery, terwijl u bent aangemeld als gebruikermssql.su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
De assessment configureren
De SQL Assessment API levert output in JSON-formaat. Om de SQL Assessment API te configureren, voltooi je de volgende stappen:
Maak een login aan voor SQL Server-assessments met SQL-authenticatie in de instantie die je wilt beoordelen. Gebruik het volgende Transact-SQL script om een login en een sterk wachtwoord aan te maken. Uw wachtwoord moet voldoen aan het standaard SQL Server-wachtwoordbeleid . Standaard moet het wachtwoord ten minste acht tekens lang zijn en tekens bevatten uit drie van de volgende vier sets: hoofdletters, kleine letters, basis-10 cijfers en symbolen. Wachtwoorden mogen maximaal 128 tekens lang zijn. Gebruik wachtwoorden die zo lang en complex mogelijk zijn.
USE [master]; GO CREATE LOGIN [assessmentLogin] WITH PASSWORD = N'<password>'; GRANT CONTROL SERVER TO [assessmentLogin]; GODe
CONTROL SERVERtoestemming werkt voor de meeste beoordelingen. Echter, een paar beoordelingen vereisen mogelijk systeembeheerdersrechten . Als je die beoordelingen niet uitvoert, gebruik dan de machtigingCONTROL SERVER.Sla de inloggegevens op om verbinding te maken met de instantie. Vervang
<password>het door het wachtwoord dat je in de vorige stap gebruikte.echo "assessmentLogin" > /var/opt/mssql/secrets/assessment echo "<password>" >> /var/opt/mssql/secrets/assessmentBeveilig de nieuwe evaluatiereferenties door ervoor te zorgen dat alleen de
mssqlgebruiker toegang heeft tot de referenties.chmod 600 /var/opt/mssql/secrets/assessment chown mssql:mssql /var/opt/mssql/secrets/assessment
Het evaluatiescript downloaden
Het volgende voorbeeldscript roept de SQL Assessment API aan met behulp van de inloggegevens die je in de voorgaande stappen hebt aangemaakt. Het script genereert JSON-output in de /var/opt/mssql/log/assessments map.
Opmerking
De SQL Assessment-API kan ook uitvoer genereren in CSV- en XML-indelingen.
Dit script is beschikbaar om te downloaden via GitHub.
U kunt dit bestand opslaan als /opt/mssql/bin/runassessment.ps1.
[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
}
}
Opmerking
Wanneer je dit script uitvoert in vertrouwde omgevingen en je krijgt een prelogin handshake-fout, voeg dan de -TrustServerCertificate vlag toe aan de commando's voor $serverName, $hostName, en Get-SqlInstance regels in de code.
De evaluatie uitvoeren
Zorg dat de
mssqlgebruiker het script bezit en het kan uitvoeren.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Maak een logmap aan en geef de
mssqlgebruiker rechten voor die map.mkdir /var/opt/mssql/log/assessments/ chown mssql:mssql /var/opt/mssql/log/assessments/ chmod 0700 /var/opt/mssql/log/assessments/Je kunt nu je eerste beoordeling maken als gebruiker
mssql. Het uitvoeren van assessments als deze gebruiker is veiliger, vooral wanneer je latere assessments automatisch doorcronofsystemdlaat lopen.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"Wanneer het commando klaar is, wordt de uitvoer in JSON-formaat aangemaakt. Je kunt deze uitvoer gebruiken met elk hulpmiddel dat het parsen van JSON-bestanden ondersteunt, inclusief Visual Studio Code.