O SQL Server Agent é um componente usado para automação de tarefas do banco de dados. Por exemplo, precisamos realizar a manutenção do Índice nos servidores de Produção apenas fora do horário comercial. Então, criamos um trabalho do SQL Server para executar a manutenção do índice e o agendamos para o horário “off”.
Quando instalamos o SQL Server, o serviço SQL Server Agent é desabilitado. Primeiro, nós o habilitamos e o iniciamos manualmente. Em seguida, configuramos o trabalho do SQL Server, usando o SQL Server Management Studio e os procedimentos armazenados do sistema do banco de dados MSDB.
Este artigo explica como criar um trabalho do SQL Server usando os procedimentos armazenados do sistema do banco de dados MSDB.
Os procedimentos armazenados do sistema do banco de dados MSDB
SQL Server usa os seguintes:
- sp_add_job :o procedimento é para criar um novo trabalho. Se for bem-sucedido, retornará @job_id. Os seguintes argumentos são aplicáveis:
- @job_name:é um nome de trabalho exclusivo.
- @enabled:o trabalho está ativado ou desativado. Depois que um trabalho é criado, você pode definir o valor do parâmetro como 1 para habilitar o trabalho.
- @notify_level_eventlog:este parâmetro é usado para gravar o status do trabalho SQL no visualizador de eventos do Windows.
Valor | Descrição |
0 | O resultado do trabalho não será gravado no log de eventos. |
1 | Se o job for executado com sucesso, o resultado será gravado no visualizador de eventos |
2 (valor padrão) | Se o trabalho falhar, o resultado e a mensagem de erro serão gravados no visualizador de eventos |
3 | O resultado do trabalho é gravado no visualizador de eventos. |
- @notify_level_email:Este parâmetro serve para enviar o email sobre o resultado do SQL Job. Os valores válidos do parâmetro são os mesmos que os valores do argumento @notify_level_eventlog.
- @notify_level_page:Este parâmetro serve para enviar a notificação do pager do resultado do SQL Job. Os valores válidos dos parâmetros são os mesmos que os valores do argumento @notify_level_eventlog.
- @delete_level:Este parâmetro serve para excluir o trabalho após a conclusão. Nesse caso, o valor do parâmetro deve ser 1. Observe que o valor padrão é 0; então, ele não excluirá o trabalho após a conclusão.
- @category_level:Este parâmetro indica os valores da categoria de trabalho. O valor padrão é NULL.
- @owner_login_name:o valor é o nome do domínio ou o nome de login SQL do proprietário do trabalho.
2. Sp_add_jobservador: Este procedimento armazenado serve para especificar o servidor de destino para a execução do SQL Job. O procedimento aceita os seguintes argumentos:
- @job_id:É um UNIQUEIDENTIFIER do SQL Job. O valor padrão deste argumento é NULL.
- @job_name:é o nome do trabalho SQL.
- @server_name:É o nome do servidor onde você deseja executar o SQL Job. O valor do argumento padrão pode ser o servidor local (LOCAL) ou o nome do host do servidor de destino.
3. sp_add_jobstep: Esse procedimento armazenado funciona para adicionar a etapa de trabalho no SQL Job. O procedimento usa os seguintes argumentos:
- @job_name:o nome do trabalho no qual você está adicionando a etapa. É um SYSNAME com NULL como valor padrão.
- @step_name:o nome da etapa. É um SYSNAME com NULL como valor padrão.
- @step_id:o ID sequencial da etapa do job. É um número incremental sem uma lacuna. É um valor INT e o valor padrão é NULL.
- @cmdexec_success_code:esse valor é retornado pelo subsistema CmdExec. Indica se a execução do comando foi bem-sucedida. O código é um valor int com 0 como valor padrão.
- @on_sucess_action:esse valor indica a ação que deve ser executada após a conclusão bem-sucedida da etapa de trabalho. Os valores podem ser qualquer um dos seguintes:
Valor | Descrição |
1 | Saia do trabalho e retorne com sucesso |
2 | Sair do trabalho e retornar com falha |
3 | Ir para a próxima etapa do trabalho |
4 | Vá para o ID da etapa de on_success_step_id |
- @on_fail_action:especifique qual ação executar se as etapas da tarefa falharem. É um valor INT e o valor padrão é NULL.
- @retry_attempt:especifique o número de tentativas após a falha da etapa do trabalho. É um valor INT e o valor padrão é NULL.
- @retry_interval:defina o intervalo de tempo (minutos) entre duas tentativas de falha da etapa do SQL Job. É um valor INT e o valor padrão é NULL.
- @os_run_priority:
- @Subsystem:especifique o nome do subsistema usado pelo SQL Server Agent para executar o comando. Os valores válidos são os seguintes:
Valor do subsistema | Descrição |
CmdExec | Comando do sistema operacional ou o arquivo executável (*.exe,*.bat) |
ANALISISQUERY | Consultas do serviço de análise do SQL Server, por exemplo, MDX, DMX. |
ANALISISQUERY | Comando do serviço de análise do SQL Server, por exemplo, XMLA. |
SSIS | Pacote de serviço de integração do SQL Server. |
PowerShell | Comando ou script do PowerShell. |
T-SQL | Consulta T-SQL ou procedimento armazenado |
Distribuição | Agente distribuidor de replicação do SQL Server. |
Instantâneo | Agente de instantâneo de replicação do SQL Server. |
Leitor de Log | Agente do leitor de log de replicação do SQL Server. |
Leitor de fila | Leitor de fila de replicação do SQL Server. |
- @command:especifique o comando que o SQL Server Agent Service deve executar por meio do subsistema. O tipo de dados é varchar(max) e o valor padrão é NULL.
- @Database_name:Especifique o nome do banco de dados no qual deseja executar o comando. Este parâmetro é útil quando você está executando um script T-SQL usando o SQL Server Agent.
4. Sp_add_jobshorário: o procedimento armazenado serve para criar o agendamento do SQL Job. Este procedimento usa os seguintes argumentos:
- @job_name:especifique o nome do trabalho SQL. O agendamento será feito para o trabalho SQL especificado no argumento @job_name.
- @name:o nome da programação. O tipo de dados é varchar e o valor padrão é NULL.
- @enabled:defina 1 para ativar a programação ou 0 para desativá-la.
- @freq_type:indica a hora da execução do trabalho SQL. O tipo de dados do parâmetro é INT e o valor padrão é 0. Os valores válidos são qualquer um dos seguintes:
Valor | Descrição |
1 | O trabalho será executado apenas uma vez. |
4 | Diariamente. |
8 | Semanalmente |
16 | Mensal |
64 | Execute o trabalho quando o SQL Server Agent Service for iniciado |
128 | Execute o trabalho SQL quando o servidor estiver ocioso. |
- @freq_interval:indica o dia da execução do job SQL. O tipo de dados é INT e o valor padrão é 0. O valor depende do valor especificado no parâmetro @freq_type. Os valores válidos são qualquer um dos seguintes:
Valor | Efeito no cronograma de trabalho |
1 (uma vez) | O @Freq_interval não será usado. |
4 (diariamente) | A cada @freq_interval dias |
8 | O valor do @Freq_interval pode ser qualquer um dos seguintes: 1 =domingo 2 =segunda-feira 4 =terça-feira 8 =quarta-feira 16 =quinta-feira 32 =sexta-feira 64 =sábado |
16 | Execute o trabalho no @Freq_interval dia do mês |
64 | O @Freq_interval não será usado |
128 | O @Freq_interval não será usado |
- @freq_subday_type:especifique a unidade do freq_subday_interval. O tipo de dados é INT e o valor padrão é NULL.
- @active_start_date:defina a data em que deseja iniciar a execução do trabalho. O tipo de dados é INT e não possui um valor padrão. O formato de data é AAAAMMDD. O valor deve ser maior ou igual a 19900101.
- @active_end_date:especifique a data em que interromper a execução do trabalho. O tipo de dados é INT, sem valor padrão. O formato de data é AAAAMMDD e o valor deve ser maior ou igual a 19900101.
- @active_start_time:especifique a hora em que deseja iniciar a execução do trabalho. O tipo de dados é INT, sem valor padrão. O formato de hora é HHMMSS.
- @active_end_time:especifique a hora em que você deseja interromper a execução do trabalho. O tipo de dados é INT, sem valor padrão. O formato de hora é HHMMSS.
Código T-SQL para criar um trabalho SQL
Para ilustrar os processos, usamos o SQL Server 2019 na estação de trabalho com o AdventureWorks2017 banco de dados, restaurado de um backup. Criamos um trabalho SQL chamado Backup Completo Diário – gera um backup do AdventureWorks2017 banco de dados e o copia em C:\Backups localização.
Primeiro, devemos habilitar os Agent XPs. É uma opção avançada. Portanto, primeiro ativamos a opção de configuração avançada e o componente Agent XPs.
Para fazer isso, execute a seguinte consulta:
EXEC Sp_configure
'Show advanced options',
1
go
RECONFIGURE WITH override
EXEC Sp_configure
'Agent XPs',
1
go
RECONFIGURE WITH override
Assim que o Agente estiver habilitado, iniciamos o serviço do Agente.
Abra o SQL Server Management Studio e conecte-se à instância do SQL Server. Em seguida, clique com o botão direito do mouse no SQL Server Agent e clique em Iniciar .
Após o início do Agente, podemos criar os trabalhos do agente SQL Server.
Conforme mencionado, criaremos um trabalho SQL para gerar um backup de AdventureWorks2017 base de dados. Para isso, executamos o seguinte comando usando o SQL Server Agent.
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
Para criar um novo trabalho SQL chamado Backup completo diário, execute o seguinte script:
USE [msdb]
go
DECLARE @jobId BINARY(16)
EXEC msdb.dbo.Sp_add_job
@job_name=N'Daily Full Backup',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_page=2,
@delete_level=0,
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'NISARG-PC\Nisarg',
@job_id = @jobId output
SELECT @jobId
go
Ele executará o trabalho na minha estação de trabalho local. Assim, nós o adicionamos ao Job Server.
Execute a seguinte consulta:
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
A etapa do trabalho executa o banco de dados de backup comando. Para configurar a etapa de trabalho, use o seguinte código:
USE [msdb]
go
EXEC msdb.dbo.Sp_add_jobstep
@job_name=N'Daily Full Backup',
@step_name=N'Generate Backup',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0,
@subsystem=N'TSQL',
@command=
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
,
@database_name=N'master',
@flags=0
go
O trabalho SQL será executado diariamente à 1h. Para configurar o agendamento, use o seguinte código:
USE [msdb]
go
DECLARE @schedule_id INT
EXEC msdb.dbo.Sp_add_jobschedule
@job_name=N'Daily Full Backup',
@name=N'Run Backup At',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20200918,
@active_end_date=99991231,
@active_start_time=10000,
@active_end_time=235959,
@schedule_id = @schedule_id output
SELECT @schedule_id
go
Todo o código do trabalho é o seguinte:
USE [msdb]
go
DECLARE @jobId BINARY(16)
EXEC msdb.dbo.Sp_add_job
@job_name=N'Daily Full Backup',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_page=2,
@delete_level=0,
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'NISARG-PC\Nisarg',
@job_id = @jobId output
SELECT @jobId
go
EXEC msdb.dbo.Sp_add_jobserver
@job_name=N'Daily Full Backup',
@server_name = N'NISARG-PC'
go
USE [msdb]
go
EXEC msdb.dbo.Sp_add_jobstep
@job_name=N'Daily Full Backup',
@step_name=N'Generate Backup',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0,
@subsystem=N'TSQL',
@command=
N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'
,
@database_name=N'master',
@flags=0
go
USE [msdb]
go
DECLARE @schedule_id INT
EXEC msdb.dbo.Sp_add_jobschedule
@job_name=N'Daily Full Backup',
@name=N'Run Backup At',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20200918,
@active_end_date=99991231,
@active_start_time=10000,
@active_end_time=235959,
@schedule_id = @schedule_id output
SELECT @schedule_id
go
Executamos o trabalho manualmente para a demonstração primeiro, executando o código abaixo:
use msdb
go
exec sp_start_job 'Daily Full Backup'
Você pode visualizar o status do trabalho executando a seguinte consulta:
SELECT NAME
AS [Job Name],
CONVERT(VARCHAR, Dateadd(s, ( run_time / 10000 ) * 60 * 60
+ ( ( run_time - ( run_time / 10000 ) *
10000 ) /
100 ) * 60
+ ( run_time - ( run_time / 100 ) * 100
), CONVERT(DATETIME, Rtrim(run_date), 113)), 100)
AS
[Job Executed Date and Time],
CASE
WHEN enabled = 1 THEN 'Enabled'
ELSE 'Disabled'
END
[Job Status],
CASE
WHEN JobHistory.run_status = 0 THEN 'Failed'
WHEN JobHistory.run_status = 1 THEN 'Succeeded'
WHEN JobHistory.run_status = 2 THEN 'Retry'
WHEN JobHistory.run_status = 3 THEN 'Cancelled'
ELSE 'Unknown'
END
[Job Outcome]
FROM sysjobhistory JobHistory
JOIN sysjobs Jobs
ON JobHistory.job_id = Jobs.job_id
WHERE NAME = 'Daily Full Backup'
Saída:
Para visualizar o arquivo de backup, abra o C:\Backups localização:
Como você pode ver, o arquivo de backup foi criado.