Fala pessoal, tudo em ordem?! Espero que sim!
Atualmente não temos disponível SQL Agent para Azure SQL Database, esta feature está disponível apenas no serviço Managed Instance e caso você faça deploy de uma Virtual Machine (IaaS), sendo assim, precisamos usar de alternativas para automatizar execuções de scripts, sejam eles para processar dados relacionados ao negócio ou manutenções de banco de dados tais como rebuild/reorg de índices, atualização de estatísticas, etc.
Neste post vou mostrar para vocês como automatizar execuções de scripts t-sql fazendo uso do serviço Azure Automation Account, com Runbook desenvolvido na linguagem Powershell 5.1.
Pow Wawa, mas ai você já está complicando demais, serviço Azure com powershell pra rodar script SQL?
Não se aveche, pois o código powershell foi desenvolvido para ser utilizado de forma dinâmica em qualquer situação que necessitem execução de scripts t-sql, ou seja, uma vez que você fizer deploy do Runbook, possibilitará que a automação seja dinâmica, sendo que em cada agendamento que você precise configurar, será utilizado o mesmo Runbook porém você definirá os parâmetros de conexão e script a ser executado para cada Agendamento. Na prática ficará mais fácil entender, então bora lá.
Primeiramente será necessário fazer deploy do serviço Automation Account, lembrando que não é necessário 1 deploy de um recurso Azure Automation account para cada automação, você pode ter várias automações no mesmo Azure Automation Account, para saber os limites, consulte o link Azure Automation Service Limits:
No portal Azure, pesquise por “Automation Accounts”:

Clique em Create/Criar:

Preencha com as informações necessárias para criação do Automation Account:


Na configuração de rede, selecione “public” caso você vá acessar algum Banco de dados disponível publicamente, já em caso de ambiente produtivo, recomendo que utilizem a opção “Private” e criem endpoint para que o Automation Account possua acesso à(s) rede(s) privadas onde se encontram seus bancos de dados. Especificarei em outro post criação do endpoint para não estender demais esse post aqui:

Adicione as tags necessárias:

Revise e se tudo estiver ok, clique em Create/Criar para provisionar o seu Automation Account:

Agora a nossa Automation Account está criada, e antes de configurar nosso Runbook vamos fazer duas configurações que são pré-requisitos para o funcionamento do nosso Runbook, são elas a credencial onde será usada para se autenticar ao Banco de Dados e importação de módulo do Powershell utilizado no Runbook.
Credenciais: Para que as senha não fiquem exportas, vamos criar uma credencial na Automation Account a qual será usada no Runbook, lembrando que você pode criar várias credenciais de acordo com o acesso a cada banco de dados. Acesse opção “Credentials/Credenciais” da sua Automation Account e crie sua credencial de acordo com seu ambiente de banco de dados:

Com as credenciais criadas, nos resta agora importar o módulo sqlserver do powershell para que seja possível execução do comando “Invoke-SqlCmd”. Na página da sua Automation Account, navegue na opção “Modules/Módulos” e clique em “Adicionar um módulo”, selecione a opção “Browse from gallery / Busque na galeria”, pesquise pela opção “sqlserver” e a selecione, em seguida selecione a versão 5.1 do powershell:


Finalmente chegou a hora de criar nosso Runbook, em sua Automation Account, navegue na opção “Runbooks” e clique em “Create Runbook / Criar Runbook”, nomeie seu Runbook e seleciona tipo “PowerShell Workflow”, sendo versão 5.1 a única disponível neste momento.

Ao criar o seu Runbook, será apresentado página para construir o seu código, cole o código abaixo em seu Runbook, na sequência salve a alteração e clique em “Publicar”:
<#
.DESCRIPTION
This runbook demonstrates how to execute commands in SQL Server. import sqlserver module is required to run Invoke-SqlCmd
This runbook also requires an Automation Credential, please create one to use
https://learn.microsoft.com/en-us/azure/automation/shared-resources/credentials?tabs=azure-powershell
.PARAMETER SqlServer
String name of the SQL Server to connect to
.PARAMETER SqlServerPort
Integer port to connect to the SQL Server on
.PARAMETER Database
String name of the SQL Server database to connect to
.PARAMETER Script
String Script that will be executed in you SQL Server
.PARAMETER SqlCredentialName
Automation Account Credential containing a username and password with access to the SQL Server
.EXAMPLE
sqldb-SqlCommandExecution -SqlServer "xxxxxxxx.database.windows.net" -SqlServerPort 1433 -Database "db_test" -Script 'drop table if exists teste; create table teste(id int);' -SqlCredentialName 'none'
To test this code in Powershell ISE in necessary to comment code block between line 55 and 59,
after that, to uncomment code block between line 65 and 68 putting a valid user and password.
.NOTES
AUTHOR: Walisson Alkmim
LASTEDIT: Fev, 2023
#>
workflow sqldb-SqlCommandExecution
{
param(
[parameter(Mandatory=$True)]
[string] $SqlServer,
[parameter(Mandatory=$False)]
[int] $SqlServerPort = 1433,
[parameter(Mandatory=$True)]
[string] $Database,
[parameter(Mandatory=$True)]
[string] $Script,
[parameter(Mandatory=$True)]
[string] $SqlCredentialName
)
#######################################################################################
# Getting Automation Account Credentials
$myCred = Get-AutomationPSCredential -Name $SqlCredentialName
$userName = $myCred.UserName
$password = $myCred.Password
$myPsCred = New-Object System.Management.Automation.PSCredential ($userName,$password)
#######################################################################################
#######################################################################################
# only to validate in Powershell ISE
# $userName = 'User'
# $password = ConvertTo-SecureString "Password" -AsPlainText -Force
# $myPsCred = New-Object System.Management.Automation.PSCredential ($userName,$password)
#######################################################################################
Invoke-SqlCmd -ServerInstance "$SqlServer,$SqlServerPort" -Database $Database -Credential $myPsCred -Query $Script -OutputSqlErrors $true
}
# Testing
# sqldb-SqlCommandExecution -SqlServer "xxxxxxxx.database.windows.net" -SqlServerPort 1433 -Database "db_test" -Script 'drop table if exists teste; create table teste(id int);' -SqlCredentialName 'none'

Você pode também utilizar a opção “Painel de teste” para validar execução do Runbook, preenchendo parâmetros:

Proooonto, nosso Runbook está pronto para de fato ser usado, sendo assim, vamos agora criar um agendamento com os devidos parâmetros de sua automação. Selecionando seu Runbook, navegue na opção “Schedule / Agendamentos” e adicione seu agendamento preenchendo a frequência de execução e os parâmetros necessários para executar seu Script:

Configurando frequência e associando à sua automação:

Configurando os parâmetros necessários para a execução:

Agora salve o seu agendamento e sua automação já se encontrará configurada. Caso precise agendar execução de novos scripts, repita o procedimento de criação de Schedule / Agendamento:

Para acompanhar suas execuções, acesse a opção “Jobs” do seu Runbook e verás as execuções realizadas, para verificar os detalhes, clique na execução desejada onde terá acesso a todas as informações necessários para realizar troubleshooting:


Vídeo explicativo juntamente com passo a passo para implementação de automação utilizando Azure Automation Account:
É isso galera, um pouco longo, mas bem útil para automações. Espero que tenham gostado! Grande abraço