sql >> Base de Datos >  >> RDS >> Sqlserver

Configurar trabajos de SQL en SQL Server usando T-SQL

El Agente SQL Server es un componente utilizado para la automatización de tareas de base de datos. Por ejemplo, necesitamos realizar el mantenimiento del índice en los servidores de producción solo durante el horario no comercial. Entonces, creamos un trabajo de SQL Server para ejecutar el mantenimiento del índice y lo programamos para las horas "fuera".

Cuando instalamos SQL Server, el servicio del Agente SQL Server está deshabilitado. Primero, lo habilitamos y lo iniciamos manualmente. Luego, configuramos el trabajo de SQL Server, usando SQL Server Management Studio y los procedimientos almacenados del sistema de la base de datos MSDB.

Este artículo explica cómo crear un trabajo de SQL Server utilizando los procedimientos almacenados del sistema de la base de datos MSDB.

Los procedimientos almacenados del sistema de la base de datos MSDB

SQL Server utiliza los siguientes:

  1. sp_add_job :el procedimiento es para crear un nuevo trabajo. Si tiene éxito, devuelve @job_id. Los siguientes argumentos son aplicables:
  • @job_name:Es un nombre de trabajo único.
  • @enabled:el trabajo está habilitado o deshabilitado. Una vez que se crea un trabajo, puede establecer el valor del parámetro en 1 para habilitar el trabajo.
  • @notify_level_eventlog:este parámetro se usa para escribir el estado del trabajo de SQL en el visor de eventos de Windows.
Valor Descripción
0 El resultado del trabajo no se escribirá en el registro de eventos.
1 Si el trabajo se ejecuta correctamente, el resultado se escribirá en el visor de eventos
2 (valor predeterminado) Si el trabajo falla, el resultado y el mensaje de error se escribirán en el visor de eventos
3 El resultado del trabajo se escribe en el visor de eventos.
  • @notify_level_email:este parámetro sirve para enviar el correo electrónico sobre el resultado del trabajo SQL. Los valores válidos del parámetro son los mismos que los valores del argumento @notify_level_eventlog.
  • @notify_level_page:este parámetro sirve para enviar la notificación del buscapersonas del resultado del trabajo de SQL. Los valores válidos de los parámetros son los mismos que los valores del argumento @notify_level_eventlog.
  • @delete_level:este parámetro sirve para eliminar el trabajo una vez finalizado. En este caso, el valor del parámetro debe ser 1. Tenga en cuenta que el valor predeterminado es 0; entonces, no eliminará el trabajo después de completarlo.
  • @category_level:este parámetro indica los valores de categoría de trabajo. El valor predeterminado es NULL.
  • @owner_login_name:el valor es el nombre de dominio o el nombre de inicio de sesión de SQL del propietario del trabajo.

2. Sp_add_jobserver: Este procedimiento almacenado sirve para especificar el servidor de destino para la ejecución del trabajo SQL. El procedimiento acepta los siguientes argumentos:

  • @job_id:Es un IDENTIFICADOR ÚNICO del trabajo SQL. El valor predeterminado de este argumento es NULL.
  • @job_name:Es el nombre del Trabajo SQL.
  • @server_name:Es el nombre del servidor donde desea ejecutar el trabajo de SQL. El valor del argumento predeterminado puede ser el servidor local (LOCAL) o el nombre de host del servidor de destino.

3. sp_add_jobstep: Este procedimiento almacenado funciona para agregar el paso de trabajo en SQL Job. El procedimiento utiliza los siguientes argumentos:

  • @job_name:el nombre del trabajo en el que está agregando el paso. Es un SYSNAME con NULL como valor predeterminado.
  • @step_name:el nombre del paso. Es un SYSNAME con NULL como valor predeterminado.
  • @step_id:el ID secuencial del paso de trabajo. Es un número incremental sin espacio. Es un valor INT y el valor predeterminado es NULL.
  • @cmdexec_success_code:este valor lo devuelve el subsistema CmdExec. Indica si la ejecución del comando fue exitosa. El código es un valor int con 0 como valor predeterminado.
  • @on_sucess_action:este valor indica la acción que se debe realizar después de que el paso del trabajo se complete correctamente. Los valores pueden ser cualquiera de los siguientes:
Valor Descripción
1 Deja el trabajo y regresa con éxito
2 Salir del trabajo y volver fallado
3 Ir al siguiente paso del trabajo
4 Ir a la identificación del paso de on_success_step_id
  • @on_fail_action:especifique qué acción realizar si los pasos del trabajo fallan. Es un valor INT y el valor predeterminado es NULL.
  • @retry_attempt:especifique el número de reintentos después del error del paso del trabajo. Es un valor INT y el valor predeterminado es NULL.
  • @retry_interval:establezca el intervalo de tiempo (minutos) entre dos intentos fallidos de paso de trabajo SQL. Es un valor INT y el valor predeterminado es NULL.
  • @os_run_priority:
  • @Subsistema:especifique el nombre del subsistema utilizado por el Agente SQL Server para ejecutar el comando. Los valores válidos son los siguientes:
Valor del subsistema Descripción
CmdEjecutivo Comando del sistema operativo o archivo ejecutable (*.exe,*.bat)
CONSULTA DE ANÁLISIS Consultas del servicio de análisis de SQL Server, por ejemplo, MDX, DMX.
CONSULTA DE ANÁLISIS Comando de servicio de análisis de SQL Server, por ejemplo, XMLA.
SSIS Paquete de servicio de integración de SQL Server.
PowerShell Comando o script de PowerShell.
T-SQL Consulta T-SQL o procedimiento almacenado
Distribución Agente distribuidor de replicación de SQL Server.
Instantánea Agente de instantáneas de replicación de SQL Server.
Lector de registros Agente de lectura de registros de replicación de SQL Server.
Lector de cola Lector de cola de replicación de SQL Server.
  • @comando:especifique el comando que el servicio del Agente SQL Server debe ejecutar a través del subsistema. El tipo de datos es varchar(max) y el valor predeterminado es NULL.
  • @Database_name:especifique el nombre de la base de datos donde desea ejecutar el comando. Este parámetro es útil cuando está ejecutando un script T-SQL utilizando el Agente SQL Server.

4. Sp_add_jobschedule: el procedimiento almacenado sirve para crear la programación del trabajo de SQL. Este procedimiento utiliza los siguientes argumentos:

  • @job_name:especifique el nombre del trabajo de SQL. La programación se realizará para el trabajo de SQL especificado en el argumento @job_name.
  • @name:el nombre de la programación. El tipo de datos es varchar y el valor predeterminado es NULL.
  • @enabled:establece 1 para habilitar el horario o 0 para deshabilitar el horario.
  • @freq_type:indica el tiempo de ejecución del trabajo SQL. El tipo de datos del parámetro es INT y el valor predeterminado es 0. Los valores válidos son cualquiera de los siguientes:
Valor Descripción
1 El trabajo se ejecutará una sola vez.
4 Diariamente.
8 Semanal
16 Mensual
64 Ejecutar el trabajo cuando se inicia el servicio del Agente SQL Server
128 Ejecuta el trabajo SQL cuando el servidor está inactivo.
  • @freq_interval:indica el día de la ejecución del trabajo SQL. El tipo de datos es INT y el valor predeterminado es 0. El valor depende del valor especificado en el parámetro @freq_type. Los valores válidos son cualquiera de los siguientes:
Valor Efecto en la programación del trabajo
1 (una vez) El @Freq_interval no se utilizará.
4 (diario) Cada @freq_interval días
8 El valor de @Freq_interval puede ser cualquiera de los siguientes:
1 =domingo
2 =lunes
4 =martes
8 =miércoles
16 =jueves
32 =viernes
64 =Sábado
16 Ejecute el trabajo en @Freq_interval día del mes
64 El @Freq_interval no se utilizará
128 El @Freq_interval no se utilizará
  • @freq_subday_type:especifica la unidad del freq_subday_interval. El tipo de datos es INT y el valor predeterminado es NULL.
  • @active_start_date:establezca la fecha en la que desea iniciar la ejecución del trabajo. El tipo de datos es INT y no tiene un valor predeterminado. El formato de fecha es AAAAMMDD. El valor debe ser mayor o igual que 19900101.
  • @active_end_date:especifique la fecha en la que detener la ejecución del trabajo. El tipo de datos es INT, sin valor predeterminado. El formato de fecha es AAAAMMDD y el valor debe ser mayor o igual que 19900101.
  • @active_start_time:especifique la hora a la que desea iniciar la ejecución del trabajo. El tipo de datos es INT, sin un valor predeterminado. El formato de hora es HHMMSS.
  • @active_end_time:especifique la hora a la que desea detener la ejecución del trabajo. El tipo de datos es INT, sin un valor predeterminado. El formato de hora es HHMMSS.

Código T-SQL para crear un trabajo SQL

Para ilustrar los procesos, usamos SQL Server 2019 en la estación de trabajo con AdventureWorks2017 base de datos, restaurada a partir de una copia de seguridad. Creamos un trabajo SQL llamado Copia de seguridad completa diaria – genera una copia de seguridad del AdventureWorks2017 base de datos y la copia en C:\Backups ubicación.

Primero, debemos habilitar los Agent XPs. Es una opción avanzada. Por ello, primero habilitamos la opción de configuración avanzada y el componente Agent XPs.

Para hacerlo, ejecute la siguiente consulta:

EXEC Sp_configure 
  'Show advanced options', 
  1 

go 

RECONFIGURE WITH override 

EXEC Sp_configure 
  'Agent XPs', 
  1 

go 

RECONFIGURE WITH override 

Una vez habilitado el Agente, iniciamos el servicio del Agente.

Abra SQL Server Management Studio y conéctese a la instancia de SQL Server. Luego, haga clic derecho en el Agente SQL Server y haga clic en Inicio .

Después del inicio del Agente, podemos crear los trabajos del agente de SQL Server.

Como se mencionó, crearemos un trabajo SQL para generar una copia de seguridad de AdventureWorks2017 base de datos. Para esto, ejecutamos el siguiente comando usando el Agente SQL Server.

N'Backup Database [AdventureWorks2017] to disk=''C:\Backups\AdventureWorks2017.bak'' with compression'

Para crear un nuevo trabajo de SQL denominado Copia de seguridad completa diaria, ejecute el siguiente 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  

Ejecutará el trabajo en mi estación de trabajo local. Así, lo añadimos al Job Server.

Ejecute la siguiente consulta:

EXEC msdb.dbo.Sp_add_jobserver 
  @job_name=N'Daily Full Backup', 
  @server_name = N'NISARG-PC' 
go 

El paso de trabajo ejecuta la base de datos de respaldo dominio. Para configurar el paso de trabajo, use el siguiente 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 

El trabajo de SQL se ejecutará todos los días a la 1:00 a. m. Para configurar el horario, utilice el siguiente 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 

El código completo del trabajo es el siguiente:

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 

Ejecutamos el trabajo manualmente para la demostración primero, ejecutando el siguiente código:

use msdb
go
exec sp_start_job 'Daily Full Backup'

Puede ver el estado del trabajo ejecutando la siguiente 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' 

Salida:

Para ver el archivo de copia de seguridad, abra C:\Backups ubicación:

Como puede ver, se ha creado el archivo de copia de seguridad.