Size: a a a

SqlCom.ru - Стиль жизни SQL

2021 January 13

N

Nichose in SqlCom.ru - Стиль жизни SQL
Ну тут нужен свой велосипед, можно подсмотреть тут еще, но я не уверен что это прям точное решение:
https://dba.stackexchange.com/questions/31104/calling-a-sql-server-job-within-another-job
источник

АА

Андрей Агеев... in SqlCom.ru - Стиль жизни SQL
Alexander Shishkin
Небольшой вопрос, может кто сталкивался. Есть задание SQL агента, выполняется раз в минуту. Внутри него шаг, который выполняется 1 минуту и 5 сек. Соответственно, SQL агент будет пропускать каждое второе задание, потому что оно еще не было завершено на момент старта новой итерации. Вопрос: это как то можно обойти? Хотелось бы, чтобы он или кильнул предыдущее выполнение, или запустился сразу после окончания предыдущей итерации.
Можно запускать процедуру в отдельной сессии брокера, тогда джоб будет работать только доли секунды - запустился, запостил задачу в очередь, завершился.
источник

I

Ilya in SqlCom.ru - Стиль жизни SQL
Можно на момент запуска задания скриптом проверять по системным таблицам статус выполнения задания
msdb.dbo.sysjobhistory
run_status = 4 (вроде)
В случае, если еще выполняется, делать ожидание waitfor delay и стартовать по новой. По идее и в самих заданиях есть опция retry, но там удается задать только минуты, секунды никак вроде, поэтому пробовать через waitfor delay
источник

AS

Alexander Shishkin in SqlCom.ru - Стиль жизни SQL
Благодарю за советы! Сейчас каждый из них потестирую, думаю найду то, что нужно.
источник

A

Aleksey in SqlCom.ru - Стиль жизни SQL
Если что еще maintenance plan имеет опцию execution timeout
источник

I

Ilya in SqlCom.ru - Стиль жизни SQL
Андрей Агеев
Можно запускать процедуру в отдельной сессии брокера, тогда джоб будет работать только доли секунды - запустился, запостил задачу в очередь, завершился.
По-хорошему, правильнее очередь использовать для подобных задач
источник

OM

Oleg Makarikhin in SqlCom.ru - Стиль жизни SQL
можно проверять и вешать лочку приложения. нативно уже есть в mssql
источник

АА

Андрей Агеев... in SqlCom.ru - Стиль жизни SQL
Ilya
По-хорошему, правильнее очередь использовать для подобных задач
Не понял комментарий. А я что предложил?
источник

I

Ilya in SqlCom.ru - Стиль жизни SQL
Я сослался на Ваше решение, как на наиболее подходящее по-моему мнению)
источник

АА

Андрей Агеев... in SqlCom.ru - Стиль жизни SQL
Ну так то да, брокера без очередей использовать не получиться в любом случае.
источник

АА

Андрей Агеев... in SqlCom.ru - Стиль жизни SQL
Если только с помощью джобов это минимум парочка джобов получится: job-worker + job+dispatcher
источник

I

ILYA in SqlCom.ru - Стиль жизни SQL
Alexander Shishkin
Небольшой вопрос, может кто сталкивался. Есть задание SQL агента, выполняется раз в минуту. Внутри него шаг, который выполняется 1 минуту и 5 сек. Соответственно, SQL агент будет пропускать каждое второе задание, потому что оно еще не было завершено на момент старта новой итерации. Вопрос: это как то можно обойти? Хотелось бы, чтобы он или кильнул предыдущее выполнение, или запустился сразу после окончания предыдущей итерации.
Вставь последним шагом
Exec msdb.dbo.sp_start_job @job_name = 'yourJob' , будет у тебя рекурсия)
источник

АА

Андрей Агеев... in SqlCom.ru - Стиль жизни SQL
ILYA
Вставь последним шагом
Exec msdb.dbo.sp_start_job @job_name = 'yourJob' , будет у тебя рекурсия)
Интересно кстати, взлетит такое? :) По идее статус у джоба то будет выполняется на момент вызова процедуры....
источник

TS

Tim Safari in SqlCom.ru - Стиль жизни SQL
ILYA
Вставь последним шагом
Exec msdb.dbo.sp_start_job @job_name = 'yourJob' , будет у тебя рекурсия)
если я правильно помню, джоб не может запустить сам себя.
ну, то есть, он, конечно запустит процедуру и не будет ожидать ее завершения. но процедура может попытаться запустить еще запущенный джоб и будет ошибка.
источник

АА

Андрей Агеев... in SqlCom.ru - Стиль жизни SQL
Tim Safari
если я правильно помню, джоб не может запустить сам себя.
ну, то есть, он, конечно запустит процедуру и не будет ожидать ее завершения. но процедура может попытаться запустить еще запущенный джоб и будет ошибка.
не проверял, то думаю так и должно быть
источник

I

ILYA in SqlCom.ru - Стиль жизни SQL
Возможно... Это была концепция) не исключено что ошибочная, сам не пробовал
источник

TS

Tim Safari in SqlCom.ru - Стиль жизни SQL
Ну, у меня как-то была задача запускать Джобса несколько раз подряд — я себе делал ещё и джоб «job runner”, который запускал первый джоб с определенной периодичностью
источник

АА

Андрей Агеев... in SqlCom.ru - Стиль жизни SQL
Рабочий подход: джоб стартует процедуру, которая формирует рабочую очередь, при этом предварительно проверяя состояние очереди - если очередь пустая, формирует задания, если не пустая просто выходим. Таким образом расписание джоба можно безболезненно поставить стартовать почаще - само отрегулируется.
источник

TS

Tim Safari in SqlCom.ru - Стиль жизни SQL
Андрей Агеев
Рабочий подход: джоб стартует процедуру, которая формирует рабочую очередь, при этом предварительно проверяя состояние очереди - если очередь пустая, формирует задания, если не пустая просто выходим. Таким образом расписание джоба можно безболезненно поставить стартовать почаще - само отрегулируется.
Типа такого у меня тоже было )
источник

KT

Konstantin Taranov in SqlCom.ru - Стиль жизни SQL
Alexander Shishkin
Небольшой вопрос, может кто сталкивался. Есть задание SQL агента, выполняется раз в минуту. Внутри него шаг, который выполняется 1 минуту и 5 сек. Соответственно, SQL агент будет пропускать каждое второе задание, потому что оно еще не было завершено на момент старта новой итерации. Вопрос: это как то можно обойти? Хотелось бы, чтобы он или кильнул предыдущее выполнение, или запустился сразу после окончания предыдущей итерации.
а в чем изначально логика запускать каждую минуту джоб если он работает больше минуты?
источник