Fundo
- Na minha organização atual, temos um SQL Agent Job executando um script Powershell, originalmente baseado em Script All Server Level Objects to Recreate SQL Server .
- Este trabalho escreve vários scripts que podem ser usados no caso de precisarmos fazer a recuperação de desastres.
- Nossa versão consulta um banco de dados separado que lista os servidores que devem ser verificados.
- Antes deste trabalho, eu não tinha usado o Powershell embora tivesse outra experiência em scripts (ou seja, Python).
- Também temos todos os nossos servidores configurados, usando o SQL Server Agent, para enviar e-mail aos DBAs quando houver falha nos logins.
- Um de nossos servidores de desenvolvimento tem alguns bancos de dados que são colocados offline para algum propósito comercial desconhecido (para mim).
- Quando nosso SQL Agent Job é executado, ele sempre gera alertas de login com falha quando se trata desses bancos de dados offline nesse servidor de desenvolvimento. Me pediram para ver se há alguma maneira de fazer o script pular a verificação de bancos de dados que estão offline para evitar esses alertas falsos.
- Eu rastreei a origem dos alertas de volta para a função abaixo. Acredito que este bit,
if($database.Status -eq 'Normal')
foi destinado a garantir que o banco de dados esteja online, mas não funciona. - Com base em alguma outra leitura on-line, tentei substituir
if($database.Status -eq 'Normal')
porif ($database.IsAccessible)
, mas ainda recebi o e-mail de alerta de login com falha ao executar o script.
#Function to write out Database scripts
function ScriptOutDBObjects($serverObject, $objectType)
{
foreach ($database in $srv.Databases)
{
if($database.Status -eq 'Normal')
{
$objectPath = $scriptPath + $objectType +'\'
if (!(Test-Path -Path $objectPath))
{
New-Item -ItemType Directory -Path $objectPath
}
$scriptingOptions.FileName = $objectPath + $database.Name.Replace(':','').Replace('\', '_') +'.sql'
$database.Script($scriptingOptions)
}
}
}
- O trabalho está usando o tipo Powershell, embora eu obtenha os mesmos resultados ao executar o código do Powershell ISE no meu computador local testando as coisas.
Pergunta
O Microsoft.SqlServer.Management.Smo sempre tentará abrir o banco de dados? Se sim, existe alguma bandeira ou algo que eu possa passar para que não o faça?
A resposta para quase todas as perguntas sobre Powershell/SMO é usar menos o modelo de objeto SMOs e mais TSQL. POR EXEMPLO
O melhor método de fazer o que você está fazendo é usar dbatools - é gratuito, de código aberto, muito bem mantido e usado em vários lugares - tão bem testado também.
Para o que você está fazendo, se eu entendo que a essência é -
simplifying disaster recovery with dbatools
Volte com mais perguntas se tiver. Acima irá ajudá-lo a atingir seu objetivo de criar scripts de configuração inteira ou itens selecionados do seu servidor para um cenário de DR.
por exemplo