Sou bastante novo no PowerShell e agora encontrei dbatools.io, onde gostaria de executar uma tarefa do PowerShell no SQL Agent como
$ExportPath = $env:TEMP + '\DriveSpace.csv'
$datatable = Import-Csv $ExportPath | Out-DbaDataTable
Write-DbaDataTable -SqlServer MyServer -Database Utils -InputObject $datatable -Table dbo.FreeSpaceOnDiskDrive -AutoCreateTable
Começa, mas nunca termina. Eu também tentei ter uma tarefa que está fazendo isso:
Get-DbaDatabaseSpace -SqlServer MyServer -IncludeSystemDBs | Out-DbaDataTable | Write-DbaDataTable -SqlServer MyServer -database utils -Table dbo.DiskSpaceExample -AutoCreateTable
Mesmo problema. Ele funciona bem no Windows PowerShell ISE, mas apenas trava no SQL Agent. Então agora ele criou uma nova tabela para mim e a preencheu com dados, mas o trabalho continua em execução.
O problema que você está enfrentando é com o subsistema PowerShell no SQL Server Agent. É um pouco instável com o uso de outros módulos porque você é colocado no contexto do SQL Server PowerShell Provider (SQLPS.exe). Portanto, funciona da mesma maneira como se você abrisse
sqlps.exe
e tentasse executar seu código.Uma coisa a ter em mente com o módulo dbatools é que ele entrará em conflito com o SQLPS e o
sqlserver
módulo que o MS agora mantém separado para o SQL Server. A última vez que verifiquei a principal coisa que entrou em conflito foi o TEPP que temos no módulo agora, ele simplesmente não pode carregar esse código. [Aviso: sou um dos principais contribuintes para este módulo.]O módulo dbatools possui tipos e estilos personalizados integrados, portanto, quando você executa os scripts no host do PowerShell que também possui SQLPS ou o módulo SQLServer importado, seus resultados variam.
Para utilizar dbatools em uma etapa do SQL Agent, certifique-se de usar apenas o subsistema CmdExec (tipo de etapa) e, em seguida, chame o host do PowerShell para executar seu código. Se você não quiser manter um arquivo para cada script, você pode colocar seu código em uma etapa CmdExec do SQL Agent da maneira ilustrada abaixo, mas scripts mais complexos são mais fáceis de manter por meio de arquivos.
Executando o trabalho acima me dá isso no meu banco de dados e tabela
db1.dbo.FreeSpaceOnDiskDrive
Você não entendeu como o SQL Agent funciona. O powershell é executado em sua própria janela fora da instância.
Isso significa que até que a operação seja informada como concluída ou ocorra um erro de falha, a operação do powershell permanecerá perpetuamente. Se você tentasse fechar a sessão, ela travaria indefinidamente até que você fechasse o shell. Em alguns casos, isso pode até ser impossível se você não parar corretamente o processo correto do qual o shell está disparando.
Por exemplo, e não faça isso, se você executou um powershell com a operação de pausa, seu shell ruim ficaria travado indefinidamente, pois você não tem acesso ao console do qual o agente abriu o powershell.
Não apenas isso é suportado diretamente nos documentos, ele será fechado especificamente após a conclusão da operação. Você também pode definir todos os tipos de etapas, e a documentação é rica.
Apenas, codifique um caminho de saída. Não confie em uma operação para retornar ao chamador. Você se certifica de que sim.
Na verdade, esta é a regra número um da codificação: não assuma que seu código funciona a menos que seja explicitamente garantido.
Qualquer que seja a abordagem: DAC, ODBC, bcp, conexões, conexões do Integration Services (SSIS)
O SSIS usa pacotes, ótimos para operações repetidas também.
E MAIS...
Estes não funcionaram para mim:
Um que funcionou é:
Aqui está um exemplo de cópia de um banco de dados de um servidor para outro.
Você deve usar o tipo (cmd) para o trabalho do Agente
Você também deve ter ferramentas DBA instaladas no servidor. Usando o Powershell, basta executar estes comandos: Instale o Chocolatey:
Instale ferramentas de DBA: