Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Configurar SQL Jobs no SQL Server usando T-SQL


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:
  1. 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.