Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server di Linux
SQL Assessment API menyediakan mekanisme untuk mengevaluasi konfigurasi SQL Server guna mendapatkan praktik terbaik. API dikirimkan dengan seperangkat aturan yang berisi praktik terbaik yang direkomendasikan oleh tim SQL Server. Seperangkat aturan ini ditingkatkan dengan rilis versi baru. Sangat berguna untuk memastikan konfigurasi SQL Server Anda sejalan dengan praktik terbaik yang direkomendasikan.
Set aturan yang dikirimkan Microsoft tersedia di GitHub. Anda dapat melihat seluruh set aturan di repositori sampel.
Dalam artikel ini, gunakan PowerShell untuk menjalankan SQL Assessment API for SQL Server on Linux dan container.
Prasyarat
Pastikan Anda menginstal PowerShell di Linux.
Instal modul PowerShell dari PowerShell Gallery sambil menjalankan sebagai pengguna
SqlServer.su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
Menyiapkan penilaian
SQL Assessment API menyediakan output dalam format JSON. Untuk mengonfigurasi SQL Assessment API, selesaikan langkah-langkah berikut:
Buat login untuk penilaian SQL Server menggunakan Autentikasi SQL pada instance yang ingin Anda nilai. Gunakan skrip Transact-SQL berikut untuk membuat login dan kata sandi yang kuat. Kata sandi Anda harus mengikuti kebijakan kata sandi default SQL Server. Secara default, kata sandi harus panjangnya minimal delapan karakter dan berisi karakter dari tiga dari empat set berikut: huruf besar, huruf kecil, digit dasar-10, dan simbol. Panjang kata sandi bisa hingga 128 karakter. Gunakan kata sandi yang panjang dan kompleks mungkin.
USE [master]; GO CREATE LOGIN [assessmentLogin] WITH PASSWORD = N'<password>'; GRANT CONTROL SERVER TO [assessmentLogin]; GOIzin
CONTROL SERVERini berlaku untuk sebagian besar penilaian. Namun, beberapa penilaian mungkin memerlukan hak istimewa sysadmin . Jika Anda tidak menjalankan penilaian tersebut, gunakan izinCONTROL SERVER.Simpan kredensial untuk terhubung ke instance. Ganti
<password>dengan kata sandi yang Anda gunakan pada langkah sebelumnya.echo "assessmentLogin" > /var/opt/mssql/secrets/assessment echo "<password>" >> /var/opt/mssql/secrets/assessmentAmankan kredensial penilaian baru dengan memastikan bahwa hanya pengguna yang
mssqldapat mengakses kredensial.chmod 600 /var/opt/mssql/secrets/assessment chown mssql:mssql /var/opt/mssql/secrets/assessment
Mengunduh skrip penilaian
Contoh skrip berikut memanggil SQL Assessment API menggunakan kredensial yang Anda buat pada langkah-langkah sebelumnya. Skrip menghasilkan output JSON di /var/opt/mssql/log/assessments direktori.
Catatan
API Penilaian SQL juga dapat menghasilkan output dalam format CSV dan XML.
Skrip ini tersedia untuk diunduh dari GitHub.
Anda dapat menyimpan file ini sebagai /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
}
}
Catatan
Saat Anda menjalankan skrip ini di lingkungan tepercaya, dan mendapatkan kesalahan handshake prelogin, tambahkan flag -TrustServerCertificate pada perintah di baris $serverName, $hostName, dan Get-SqlInstance dalam kode.
Jalankan penilaian
Pastikan
mssqlpengguna memiliki skrip dan dapat menjalankannya.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Buat folder log dan berikan
mssqlizin kepada pengguna untuk folder tersebut.mkdir /var/opt/mssql/log/assessments/ chown mssql:mssql /var/opt/mssql/log/assessments/ chmod 0700 /var/opt/mssql/log/assessments/Sekarang Anda dapat membuat penilaian pertama Anda sebagai pengguna
mssql. Menjalankan penilaian sebagai pengguna ini lebih aman, terutama jika Anda menjalankan penilaian selanjutnya secara otomatis melaluicronatausystemd.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"Ketika perintah selesai, output dibuat dalam format JSON. Anda dapat menggunakan output ini dengan alat apa pun yang mendukung parsing file JSON, termasuk Visual Studio Code.