Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server em Linux
A API de Avaliação SQL fornece um mecanismo para avaliar a configuração do SQL Server quanto às melhores práticas. A API é fornecida com um conjunto de regras que contém as melhores práticas recomendadas pela equipe do SQL Server. Esse conjunto de regras é aprimorado com o lançamento de novas versões. Certifique-se de que a configuração do SQL Server esteja alinhada com as melhores práticas recomendadas.
O conjunto de regras lançado pela Microsoft está disponível no GitHub. Veja o conjunto regras inteiro no repositório de exemplos.
Neste artigo, use o PowerShell para executar a API de Avaliação do SQL para o SQL Server no Linux e em contêineres.
Pré-requisitos
Certifique-se de instalar o PowerShell no Linux.
Instale o módulo
SqlServerdo PowerShell da Galeria do PowerShell, executando como o usuáriomssql.su mssql -c "/usr/bin/pwsh -Command Install-Module SqlServer"
Configurar a avaliação
A API de Avaliação SQL fornece saída em formato JSON. Para configurar a API de Avaliação SQL, complete os seguintes passos:
Crie um login para avaliações do SQL Server usando autenticação SQL na instância que você deseja avaliar. Use o script de Transact-SQL a seguir para criar um login e uma senha forte. Sua senha deve seguir a política de senha padrão do SQL Server. Por padrão, a senha precisa ter pelo menos oito caracteres e conter caracteres de três dos seguintes quatro conjuntos: letras maiúsculas, letras minúsculas, dígitos de base 10 e símbolos. As senhas podem ter até 128 caracteres. Use senhas longas e complexas.
USE [master]; GO CREATE LOGIN [assessmentLogin] WITH PASSWORD = N'<password>'; GRANT CONTROL SERVER TO [assessmentLogin]; GOA permissão
CONTROL SERVERfunciona na maioria das avaliações. No entanto, algumas avaliações podem exigir privilégios de administrador de sistemas . Se você não estiver executando essas avaliações, use as permissõesCONTROL SERVER.Armazene as credenciais para conectar à instância. Substitua
<password>pela senha que usou na etapa anterior.echo "assessmentLogin" > /var/opt/mssql/secrets/assessment echo "<password>" >> /var/opt/mssql/secrets/assessmentProteja as novas credenciais de avaliação garantindo que somente o usuário
mssqlpossa acessar as credenciais.chmod 600 /var/opt/mssql/secrets/assessment chown mssql:mssql /var/opt/mssql/secrets/assessment
Baixar o script de avaliação
O script de exemplo a seguir chama a API de Avaliação SQL usando as credenciais que você criou nos passos anteriores. O script gera saída JSON no /var/opt/mssql/log/assessments diretório.
Observação
A API de Avaliação do SQL também pode gerar saída nos formatos CSV e XML.
O script está disponível para download no GitHub.
Você pode salvar esse arquivo como /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
}
}
Observação
Quando você executa este script em ambientes confiáveis e recebe um erro de handshake pré-login, adicione o sinalizador -TrustServerCertificate aos comandos nas linhas $serverName, $hostName e Get-SqlInstance do código.
Executar a avaliação
Certifique-se de que o
mssqlusuário seja dono do script e possa executá-lo.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Crie uma pasta de log e dê permissões ao
mssqlusuário para essa pasta.mkdir /var/opt/mssql/log/assessments/ chown mssql:mssql /var/opt/mssql/log/assessments/ chmod 0700 /var/opt/mssql/log/assessments/Agora você pode criar sua primeira avaliação como usuário
mssql. Executar avaliações como este usuário é mais seguro, especialmente quando você executa automaticamente avaliações futuras por meio decronousystemd.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"Quando o comando termina, ele cria a saída em formato JSON. Você pode usar essa saída com qualquer ferramenta que suporte análise de arquivos JSON, incluindo o Visual Studio Code.