En la semana me vi con la necesidad de ejecutar un <<Job>> cada 30 segundos ó menos de un minuto, pero el detalle es que en el <<Management Studio>>, no puedo ingresar decimales, solamente puedo poner números enteros y seleccionar dos opciones de frecuencia siendo estas horas y minutos.
Buscando varias opciones encontré una característica no documentada de <<SQL Server>> que puede cambiar la programación de fecha a 30 segundos. Concretamente es un procedimiento almacenado que se llama: <<sp_update_jobschedule>> esta en <<msdb>>, para nuestro caso es el que podemos utilizar vía T-SQL y tiene los siguientes parametros.
- sp_update_jobschedule [@job_id =] job_id, | [@job_name =] 'job_name',
- [@name =] 'schedule_name'
- [, [@new_name =] 'new_schedule_name']
- [, [@enabled =] enabled]
- [, [@freq_type =] freq_type]
- [, [@freq_interval =] freq_interval]
- [, [@freq_subday_type =] freq_subday_type]
- [, [@freq_subday_interval =] freq_subday_interval]
- [, [@freq_relative_interval =] freq_relative_interval]
- [, [@freq_recurrence_factor =] freq_recurrence_factor]
- [, [@active_start_date =] active_start_date]
- [, [@active_end_date =] active_end_date]
- [, [@active_start_time =] active_start_time]
- [, [@active_end_time =] active_end_time]
Si necesitas más detalles sobre el procedimiento almacenado puedes darle una leída a el MSDN acá. En los parámetros de arriba se muestran <<@freq_subday_type>> y <<@freq_subday_interval>> que son los que nos interesan por el momento. Los valores validos para <<@freq_subday_type>>:
Value | Description (unit) |
---|---|
0x1 | At the specified time. |
0x4 | Minutes. |
0x8 | Hours. |
Pero el valor 0x2 no esta documentado y es el que establece la unidad en segundos y <<@freq_subday_interval>> establece el número de periodos donde ocurrirá cada ejecución del <<Job>>, por defecto es <<NULL>>. Entonces para ejecutar el <<Job>> cada 30 segundos ó menos de un minuto es tener a la mano el <<job_name>> y el <<schedule_name>>.
Pasos para crear un <<Job>> de SQL Server que se ejecute cada 30 segundos.
- Crea un <<Job>> que se ejecute cada minuto.
2. Obtén los valores de <<job_name>>,<<job_id>>,<<schedule_name>> del <<Job>> que acabas de crear en el servidor, para esto podemos ejecutar la siguiente consulta T-SQL.
- select sj.job_id,sj.name as job_name,ss.name as schedule_name
- from msdb..sysjobs sj inner join msdb..sysjobschedules sjs
- on sj.job_id=sjs.job_id
- inner join msdb..sysschedules ss on ss.schedule_id=sjs.schedule_id
3. Ejecuta el procedimiento <<sp_update_jobschedule>> con el parámetro <<@freq_subday_type>> igual a 0x2 y <<@freq_subday_interval>> igual al número de segundos que necesitas que se ejecute el <<Job>>, para mi caso es 30.
- exec msdb..sp_update_jobschedule @job_id = 'AE2AD631-BBD5-4195-A0DF-4BE166CA448D',
- @name ='30Seconds_Schedule', @freq_subday_type =0x2, @freq_subday_interval=30
4. ¡Disfruta!
Como dato curioso cuando intento ver las propiedades del <<Job>> desde el <<Management Studio>>, me tira un error y en la descripción, detalla que es porque la unidad mostrada no corresponde a las unidades por "Defecto".
No hay comentarios:
Publicar un comentario