Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
_Polina_
Member

Откуда: Санкт-Петербург
Сообщений: 171
Подскажите плз
Есть Job1, он заканчивает работу обычно до 8:00
В 8:40 запускается Job2, отрабатывает по результатам Job1. Раньше 8:40 его запустить нельзя (собираются дополнительные данные).
Можно ли сделать так, чтобы Job2 запускался только тогда, когда Job1 не работает?
17 сен 15, 10:14    [18159281]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
aleks2
Guest
Откройте для себя
sp_getapplock
17 сен 15, 10:17    [18159290]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4262
_Polina_
Подскажите плз
Есть Job1, он заканчивает работу обычно до 8:00
В 8:40 запускается Job2, отрабатывает по результатам Job1. Раньше 8:40 его запустить нельзя (собираются дополнительные данные).
Можно ли сделать так, чтобы Job2 запускался только тогда, когда Job1 не работает?

Почему нельзя объеденить их в один джоб и запускать последовательно как степы?
17 сен 15, 10:38    [18159406]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
_Polina_,

правильнее - в один джоб организовать, но если есть причины это не делать то -
первым шагом джоба 2 проверять, работает или нет джоб 1.
в свое время, при реализации подобного - просто профайлером посмотрел что запрашивает "job activity Monitor"
17 сен 15, 10:41    [18159420]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Мож в к-л табличке делать пометку и реагировать на нее в джобах (выполнять или пропускать) ?
17 сен 15, 12:17    [18160066]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
_Polina_
Member

Откуда: Санкт-Петербург
Сообщений: 171
Спасибо!
Почитала про - не мое. Либо я не поняла механизма, но блокировки размещать, а потом снимать не хочу. Мне нужно было понять, работает ли job.
Наткнулась на хорошую статью здесь
По п.1 у меня все сработало.
17 сен 15, 13:27    [18160581]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Самым естественным решением было бы запускать Job2 последним шагом Job1 - через T-SQL или SSIS.
17 сен 15, 13:49    [18160699]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
_Polina_
Спасибо!
Почитала про - не мое. Либо я не поняла механизма, но блокировки размещать, а потом снимать не хочу. Мне нужно было понять, работает ли job.
Наткнулась на хорошую статью здесь
По п.1 у меня все сработало.

У вас что, 2000-й сервер?

Если более поздний, то есть способ проще:

https://msdn.microsoft.com/en-us/library/ms186722.aspx
17 сен 15, 15:00    [18161286]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
komrad
Member

Откуда:
Сообщений: 5252
_Polina_
Подскажите плз
Есть Job1, он заканчивает работу обычно до 8:00
В 8:40 запускается Job2, отрабатывает по результатам Job1. Раньше 8:40 его запустить нельзя (собираются дополнительные данные).
Можно ли сделать так, чтобы Job2 запускался только тогда, когда Job1 не работает?



первым степом в Джоб2 поставьте скрипт :

while exists (
SELECT
    ja.job_id,
    j.name AS job_name,
    ja.start_execution_date,      
    ISNULL(last_executed_step_id,0)+1 AS current_executed_step_id,
    Js.step_name
FROM msdb.dbo.sysjobactivity ja 
LEFT JOIN msdb.dbo.sysjobhistory jh 
    ON ja.job_history_id = jh.instance_id
JOIN msdb.dbo.sysjobs j 
    ON ja.job_id = j.job_id
JOIN msdb.dbo.sysjobsteps js
    ON ja.job_id = js.job_id
    AND ISNULL(ja.last_executed_step_id,0)+1 = js.step_id
WHERE ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND stop_execution_date is null
and j.name='Job1')
	begin
		
		waitfor delay '00:00:10'
		print 'Waiting for Job1...'

	end


скрипт отсюда, сделано на скорую руку, можно пооптимизировать...
17 сен 15, 16:29    [18161933]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
позволю себе встрять.
Я бы сделал так:
в первом джобе сделал последний шаг в котором переводил второй джоб в "активный"
во втором джобе сделал последний шаг в котором переводил себя в "неактивный"
во втором джобе изменил бы расписание на "начинать с 8:40", повторять каждые "N минут" (выбирается от задачи и возможного простоя)

смысл в следующем: второй джоб всегда неактивный. Как только первый джоб завершает работу, то он переводит второй в активные и второй джоб может быть запущен автоматически. Учитывая расписание второго джоба, то он выполнится не раньше 8:40 и не раньше чем завершится первый. После того, как второй джоб отработает, он переведёт себя опять в состояние неактивный, т.е отработает только один раз. На следующий день всё повторится.
Необходимо предусмотреть датафлоу джоба, при котором если джоб упадет, то выполнился бы всегда последний шаг

переводить джоб из состояния активный/неактивный скриптом
-- changes the name, description, and enables status of the job NightlyBackups.
USE msdb ;
GO

EXEC dbo.sp_update_job
    @job_name = N'NightlyBackups',
    @new_name = N'NightlyBackups -- Disabled',
    @description = N'Nightly backups disabled during server migration.',
    @enabled = 1 ;
GO
18 сен 15, 08:28    [18163858]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
_Polina_
Member

Откуда: Санкт-Петербург
Сообщений: 171
Спасибо всем!
HandKot, я в результате так и сделала. Запускаю 2-й job, делаю 2 проверки:
1. Отработал ли уже 1-й job
declare
  @job_id       uniqueidentifier,
  @owner        sysname,
  @is_sysadmin  int

select
  @job_id = job_id,
  @owner  = suser_sname(owner_sid)
from
  msdb.dbo.sysjobs
where
  name = 'Cube Update All'

create table #xp_results
(
  job_id                uniqueidentifier  null,
  last_run_date         int               null,
  last_run_time         int               null,
  next_run_date         int               null,
  next_run_time         int               null,
  next_run_schedule_id  int               null,
  requested_to_run      int               null,
  request_source        int               null,
  request_source_id     sysname           null,
  running               int               null,
  current_step          int               null,
  current_retry_attempt int               null,
  job_state             int               null
)

set @is_sysadmin = coalesce(is_srvrolemember(N'sysadmin'),0)

if ((@@microsoftversion / 0x01000000) >= 8) -- SQL Server 8.0 or greater
  insert into #xp_results execute master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @owner, @job_id
else
  insert into #xp_results execute master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @owner

select Running, * from #xp_results where job_id = @job_id

if (select Running from #xp_results where job_id = @job_id) = 1
	set @is_sysadmin = 1/0

2. Отрабатывал ли успешно уже нужный мне шаг 2-го job'а
declare @i int
-- Если фокусные товары уже обновились, мы их больше не обновляем
if not exists(select *
  FROM msdb.dbo.sysjobhistory 
	where run_date = convert(varchar(8), GETDATE(), 112)   and step_name = 'Main update in job'
	and run_status = 1)
set @i = 1/0

Если и 1-й job закончился и нужный мне шаг 2-го job'а еще не запускался, тогда запускаю его.
18 сен 15, 12:49    [18165124]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
_Polina_, ну я не совсем это предлагал.
Но если работает и это Вас устраивает, то почему бы и нет
18 сен 15, 13:48    [18165576]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли запретить (в идеале отложить) запуск job, если работает другой job  [new]
aleks2
Guest
Офигеть. Скока кода, там где достаточно одного вызова sp_getapplock.
18 сен 15, 15:06    [18166124]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить