Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. 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 contendo práticas recomendadas pela equipe do SQL Server. Este conjunto de regras é melhorado com o lançamento de novas versões. É útil certificar-se de que sua configuração do SQL Server esteja de acordo com as práticas recomendadas recomendadas.
O conjunto de regras fornecido pela Microsoft está disponível no GitHub. Você pode visualizar todo o conjunto de regras no repositório de amostras .
Neste artigo, utilize o PowerShell para executar a API de Avaliação do SQL para SQL Server em Linux e contentores.
Pré-requisitos
Certifique-se de que você instalar o PowerShell no Linux.
Instale o módulo do
SqlServerPowerShell a partir da Galeria do PowerShell, em execução 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 pretende avaliar. Utilize o seguinte script Transact-SQL para criar um login e uma palavra-passe forte. A sua palavra-passe deve seguir a política de palavra-passe padrão do SQL Server. Por padrão, a senha deve ter pelo menos oito caracteres e conter caracteres de três dos quatro conjuntos a seguir: letras maiúsculas, letras minúsculas, dígitos de base 10 e símbolos. As palavras-passe podem ter até 128 caracteres. Use senhas tão longas e complexas quanto possível.
USE [master]; GO CREATE LOGIN [assessmentLogin] WITH PASSWORD = N'<password>'; GRANT CONTROL SERVER TO [assessmentLogin]; GOA permissão
CONTROL SERVERfunciona para a maioria das avaliações. No entanto, algumas avaliações podem exigir privilégios de administrador de sistemas . Se não estiveres a fazer essas avaliações, utiliza as permissões deCONTROL SERVER.Armazena as credenciais para ligar à instância. Substitua
<password>pela palavra-passe que usou no passo anterior.echo "assessmentLogin" > /var/opt/mssql/secrets/assessment echo "<password>" >> /var/opt/mssql/secrets/assessmentProteja as novas credenciais de avaliação, garantindo que apenas o usuário
mssqlpossa acessar as credenciais.chmod 600 /var/opt/mssql/secrets/assessment chown mssql:mssql /var/opt/mssql/secrets/assessment
Faça o download do script de avaliação
O seguinte script de exemplo chama a API de Avaliação SQL usando as credenciais que 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 SQL também pode gerar saída nos formatos CSV e XML.
Este script está disponível para download em GitHub.
Você pode salvar este 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 executares este script em ambientes fidedignos e obtiveres um erro de handshake pré-login, adiciona a opção -TrustServerCertificate aos comandos das linhas $serverName, $hostName e Get-SqlInstance no código.
Executar a avaliação
Certifica-te de que o
mssqlutilizador é dono do script e consegue executá-lo.chown mssql:mssql /opt/mssql/bin/runassessment.ps1 chmod 700 /opt/mssql/bin/runassessment.ps1Cria uma pasta de registo e dá permissões ao
mssqlutilizador 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 pode criar a sua primeira avaliação como
mssqlutilizador. Executar avaliações com este utilizador é mais seguro, especialmente quando executa automaticamente avaliações futuras através decronousystemd.su mssql -c "pwsh -File /opt/mssql/bin/runassessment.ps1"Quando o comando termina, cria a saída em formato JSON. Pode usar esta saída com qualquer ferramenta que suporte análise de ficheiros JSON, incluindo o Visual Studio Code.