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

Adicionar uma etapa de trabalho a um trabalho existente do SQL Server Agent (T-SQL)


Ao criar um trabalho do SQL Server Agent com T-SQL, você usa o sp_add_jobstep procedimento armazenado para adicionar cada etapa do trabalho.

Se você precisar adicionar uma nova etapa a esse trabalho, use sp_add_jobstep mais uma vez para adicionar a nova etapa de trabalho.

Mas você também pode precisar modificar a etapa existente, dependendo de como deseja que o trabalho progrida pelas etapas.

Exemplo


Neste exemplo, criamos um trabalho com uma etapa de trabalho e usamos sp_add_jobstep para adicionar uma segunda etapa a esse trabalho. Em seguida, usamos sp_update_jobstep para atualizar a primeira etapa da tarefa para que progrida para a segunda etapa da tarefa assim que for concluída.

Criar o trabalho


Primeiro, crie o trabalho com uma etapa:
USE msdb;  
GO  
EXEC sp_add_job  
    @job_name = N'SqlAgentTest',
    @description = N'Insert data.',
    @category_name = 'Database Maintenance';
GO  
EXEC sp_add_jobstep  
    @job_name = N'SqlAgentTest',  
    @step_name = N'Insert data for step 1',  
    @subsystem = N'TSQL',  
    @command = N'USE TestDB; INSERT INTO SqlAgentJobs VALUES (''SqlAgentTest'', 1, SYSDATETIME())';
GO
EXEC sp_add_schedule 
    @schedule_name = N'Run_Sat_6AM',
    @freq_type = 8,
    @freq_interval = 64,
    @freq_recurrence_factor = 1,
    @active_start_time = 060000;
GO  
EXEC sp_attach_schedule  
   @job_name = N'SqlAgentTest',  
   @schedule_name = N'Run_Sat_6AM';
GO  
EXEC sp_add_jobserver  
    @job_name = N'SqlAgentTest';
GO

Só para ficar claro, a parte a seguir foi a parte que adicionou a etapa:
EXEC sp_add_jobstep  
    @job_name = N'SqlAgentTest',  
    @step_name = N'Insert data for step 1',  
    @subsystem = N'TSQL',  
    @command = N'USE TestDB; INSERT INTO SqlAgentJobs VALUES (''SqlAgentTest'', 1, SYSDATETIME())';

Adicionar uma nova etapa de trabalho


Agora podemos usar sp_add_jobstep novamente para adicionar uma nova etapa ao trabalho.
USE msdb;
EXEC sp_add_jobstep  
    @job_name = N'SqlAgentTest',  
    @step_name = N'Insert data for step 2',  
    @subsystem = N'TSQL',  
    @command = N'USE TestDB; INSERT INTO SqlAgentJobs VALUES (''SqlAgentTest'', 2, SYSDATETIME())';

Isso adiciona uma segunda etapa ao trabalho.

Atualizar o fluxo de trabalho


Se você quiser que o trabalho progrida automaticamente da etapa 1 para a etapa 2, será necessário especificar isso na etapa 1 do trabalho.

A ação padrão para qualquer etapa da tarefa é encerrar a tarefa com sucesso assim que ela for bem-sucedida. Se a etapa falhar, a ação padrão é encerrar com falha.

Portanto, como nosso trabalho está atualmente, o trabalho será concluído assim que a etapa 1 for concluída (sem executar a etapa 2) e o histórico informará que o trabalho foi executado com êxito.

Portanto, precisamos usar sp_update_jobstep para atualizar a etapa 1, para que progrida para a etapa 2 assim que for concluída com êxito.

Também podemos especificar o que fazer se a etapa 1 falhar.
USE msdb;
EXEC sp_update_jobstep  
    @job_name = N'SqlAgentTest',  
    @step_id = 1,  
    @on_success_action = 3,  
    @on_fail_action = 3;

Nesse caso, especifiquei que ele deve progredir para a próxima etapa se for bem-sucedido e também se falhar.

Os valores que você pode fornecer para @on_success_action e @on_fail_action são como segue:
1 Saia com sucesso. Este é o padrão para @on_success_action .
2 Sair com falha. Este é o padrão para @on_fail_action .
3 Vá para a próxima etapa.
4 Vá para a etapa (ID). É aqui que você fornece o ID de uma etapa para a qual deseja que o trabalho avance.

Visualizar as etapas do trabalho


Você pode usar sp_help_job para obter informações sobre os trabalhos do SQL Server Agent no sistema.

Você pode usá-lo com ou sem parâmetros, mas para obter os detalhes da etapa do trabalho, você precisa fornecer o nome ou ID do trabalho.

Podemos usá-lo para ver as duas etapas de trabalho que criamos para o trabalho.

Assim:
EXEC sp_help_job 
	@job_name = 'SqlAgentTest';

Veja como fica o resultado ao executá-lo no SSMS:

Aqui está um exemplo do código ao usar o ID:
EXEC sp_help_job 
	@job_id = '343D9F2A-070A-4367-BF69-4248FFF57D70';

Ao usar o ID, você pode omitir o nome do parâmetro, se desejar.

Exemplo:
EXEC sp_help_job '343D9F2A-070A-4367-BF69-4248FFF57D70';

Você também pode usar sp_help_jobstep da mesma forma para retornar apenas as etapas do trabalho (sem todas as outras informações sobre o trabalho). Isso aceita o nome ou ID do trabalho, bem como um nome ou ID de etapa opcional.

Sintaxe Completa


A sintaxe completa de sp_add_jobstep fica assim:
sp_add_jobstep [ @job_id = ] job_id | [ @job_name = ] 'job_name'
     [ , [ @step_id = ] step_id ]
     { , [ @step_name = ] 'step_name' }
     [ , [ @subsystem = ] 'subsystem' ]
     [ , [ @command = ] 'command' ]
     [ , [ @additional_parameters = ] 'parameters' ]
          [ , [ @cmdexec_success_code = ] code ]
     [ , [ @on_success_action = ] success_action ]
          [ , [ @on_success_step_id = ] success_step_id ]
          [ , [ @on_fail_action = ] fail_action ]
          [ , [ @on_fail_step_id = ] fail_step_id ]
     [ , [ @server = ] 'server' ]
     [ , [ @database_name = ] 'database' ]
     [ , [ @database_user_name = ] 'user' ]
     [ , [ @retry_attempts = ] retry_attempts ]
     [ , [ @retry_interval = ] retry_interval ]
     [ , [ @os_run_priority = ] run_priority ]
     [ , [ @output_file_name = ] 'file_name' ]
     [ , [ @flags = ] flags ]
     [ , { [ @proxy_id = ] proxy_id
         | [ @proxy_name = ] 'proxy_name' } ]

Consulte a documentação da Microsoft para sp_add_jobstep para uma explicação de cada parâmetro, bem como os valores que cada um aceita.

A sintaxe completa de sp_update_jobstep fica assim:
sp_update_jobstep   
     {   [@job_id =] job_id   
       | [@job_name =] 'job_name' } ,  
     [@step_id =] step_id  
     [ , [@step_name =] 'step_name' ]  
     [ , [@subsystem =] 'subsystem' ]   
     [ , [@command =] 'command' ]  
     [ , [@additional_parameters =] 'parameters' ]  
     [ , [@cmdexec_success_code =] success_code ]  
     [ , [@on_success_action =] success_action ]   
     [ , [@on_success_step_id =] success_step_id ]  
     [ , [@on_fail_action =] fail_action ]   
     [ , [@on_fail_step_id =] fail_step_id ]  
     [ , [@server =] 'server' ]   
     [ , [@database_name =] 'database' ]  
     [ , [@database_user_name =] 'user' ]   
     [ , [@retry_attempts =] retry_attempts ]  
     [ , [@retry_interval =] retry_interval ]   
     [ , [@os_run_priority =] run_priority ]  
     [ , [@output_file_name =] 'file_name' ]   
     [ , [@flags =] flags ]  
     [ ,  {   [ @proxy_id = ] proxy_id   
            | [ @proxy_name = ] 'proxy_name' }

Consulte a documentação da Microsoft para sp_update_jobstep para uma explicação de cada parâmetro, bem como os valores que cada um aceita.