Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Job с несколькими schedule / 20 сообщений из 20, страница 1 из 1
14.11.2019, 12:30
    #39889002
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
Сейчас работает job с двумя schedule. Schedule1 на заданное время суток, schedule2- повторяющийся через небольшое время. В зависимости от schedule, по которому запустился job, в одном его шаге немного меняется логика. Другие шаги одинаковы. Конечно, вызов по повторяющемуся schedule2 может запоздать, тогда schedule1 будет проигнорирован. Но за счёт разнесения времени вызовов это пока работает. Теперь нужно добавить schedule0. Разнесение времени уже не поможет, т.к. длительность выполнения по этому schedule0 заранее не определена. Job должен выполняться строго последовательно, т.е. одновременный запуск не требуется. Как можно решить задачу в SQL Agent?

Не предлагать:
Пересоздание job

Ручное управление следующим schedule через "once time"

Зацикливание job с эмуляцией schedule

SSIS

CLR

Разнесение в несколько job тоже нежелательно, т.к. разнородных шагов может быть много и дублировать их не хочется.
...
Рейтинг: 0 / 0
14.11.2019, 13:00
    #39889026
1C Developer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
Можно завести таблицу-семафор в которой фиксировать время старта/остановки заданий.

При старте всех заданий проверять первым шагом состояние таблицы.

Подумать что делать если какое-либо задание "повиснет"...

Другой вариант пересмотреть логику исполнения - переделав все в одно задание.
...
Рейтинг: 0 / 0
14.11.2019, 13:28
    #39889059
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
tunknown
Теперь нужно добавить schedule0. Разнесение времени уже не поможет, т.к. длительность выполнения по этому schedule0 заранее не определена. Job должен выполняться строго последовательно, т.е. одновременный запуск не требуется. Как можно решить задачу в SQL Agent?
Прочитал 3 раза, не понял, в чёт тут подвох?
Для решения задачи нужно просто добавить schedule0.
...
Рейтинг: 0 / 0
14.11.2019, 13:49
    #39889085
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
tunknown,

Запускайте джоб каждые 5 минут. На первом шаге проверяйте условие по своей логике -- надо запускаться или нет и с какими параметрами. Если надо запускаться сохраняйте куда-то свои параметры и переходите не следующие шаги, где эти параметры читайте и используйте. Если причины для запуска нет, то тормозитесь.

Вообще в SSIS пакете у вас будет больше маневра. В том числе параллельность.
...
Рейтинг: 0 / 0
14.11.2019, 14:03
    #39889096
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
tunknown
Сейчас работает job с двумя schedule. Schedule1 на заданное время суток, schedule2- повторяющийся через небольшое время. В зависимости от schedule, по которому запустился job, в одном его шаге немного меняется логика. Другие шаги одинаковы. Конечно, вызов по повторяющемуся schedule2 может запоздать, тогда schedule1 будет проигнорирован. Но за счёт разнесения времени вызовов это пока работает. Теперь нужно добавить schedule0. Разнесение времени уже не поможет, т.к. длительность выполнения по этому schedule0 заранее не определена. Job должен выполняться строго последовательно, т.е. одновременный запуск не требуется. Как можно решить задачу в SQL Agent?

Не предлагать:
Пересоздание job

Ручное управление следующим schedule через "once time"

Зацикливание job с эмуляцией schedule

SSIS

CLR

Разнесение в несколько job тоже нежелательно, т.к. разнородных шагов может быть много и дублировать их не хочется.


Навязчивый бред.

Нафига фсе эти чудеса с Schedule1-2-3?
1. Одно расписание.
2. Внутри проверять не "чем запущено", а "когда запущено".
3. И фсе.
...
Рейтинг: 0 / 0
14.11.2019, 14:08
    #39889100
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
alexeyvg
Прочитал 3 раза, не понял, в чёт тут подвох?
Для решения задачи нужно просто добавить schedule0.
Возможно, я не очень ясно написал. По schedule0 job может выполняться долго и не успеет завершиться к заданному началу schedule1.

Нужно так: schedule0 в заданное время0, schedule1 всегда после schedule0, но не ранее времени1(позже можно), schedule2 регулярно в остальное время.
...
Рейтинг: 0 / 0
14.11.2019, 14:17
    #39889109
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
aleks222
Нафига фсе эти чудеса с Schedule1-2-3?
1. Одно расписание.
2. Внутри проверять не "чем запущено", а "когда запущено".
3. И фсе.
Когда будут запущены schedule1 и schedule2 неизвестно, т.к. и schedule0 будет работать заранее неизвестное время. Не хочется делать отдельную таблицу, что schedule0 и schedule1 отработали по одному разу в указанные сутки. Любой вызов job может длиться неопределённое время, в т.ч. и по schedule2.

schedule0 запустить не ранее 0

schedule1 запустить не ранее 1, но позже отработавшего 0

schedule2 запускать во всё остальное время
...
Рейтинг: 0 / 0
14.11.2019, 14:19
    #39889114
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
a_voronin
сохраняйте куда-то свои параметры и переходите не следующие шаги, где эти параметры читайте и используйте.
Хотел использовать для этого результат xp_sqlagent_enum_jobs и msdb..sysschedules без дополнительных таблиц.
...
Рейтинг: 0 / 0
14.11.2019, 14:24
    #39889117
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
tunknown,

можно использовать sp_getaplock для выполнения взаимоисключающих бизнес-процессов. И разные джобы.
...
Рейтинг: 0 / 0
14.11.2019, 14:28
    #39889121
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
Владислав Колосов
можно использовать sp_getaplock для выполнения взаимоисключающих бизнес-процессов. И разные джобы.
Благодарю, надо подумать.
...
Рейтинг: 0 / 0
14.11.2019, 15:54
    #39889172
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
tunknown
aleks222
Нафига фсе эти чудеса с Schedule1-2-3?
1. Одно расписание.
2. Внутри проверять не "чем запущено", а "когда запущено".
3. И фсе.
Когда будут запущены schedule1 и schedule2 неизвестно, т.к. и schedule0 будет работать заранее неизвестное время. Не хочется делать отдельную таблицу, что schedule0 и schedule1 отработали по одному разу в указанные сутки. Любой вызов job может длиться неопределённое время, в т.ч. и по schedule2.

schedule0 запустить не ранее 0

schedule1 запустить не ранее 1, но позже отработавшего 0

schedule2 запускать во всё остальное время


Вам бы в управдомы переквалифицироваться.
...
Рейтинг: 0 / 0
15.11.2019, 08:14
    #39889350
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
Используйте в тексте джоба макроопределения '$(ESCAPE_SQUOTE(STRTDT))', '$(ESCAPE_SQUOTE(STRTTM))'
Они выдают дату и время запуска джоба.
Вот эта статья может пригодиться:
https://www.mssqltips.com/sqlservertip/5731/how-to-pass-data-between-sql-server-agent-job-steps/
...
Рейтинг: 0 / 0
15.11.2019, 08:35
    #39889355
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
uaggster
Используйте в тексте джоба макроопределения '$(ESCAPE_SQUOTE(STRTDT))', '$(ESCAPE_SQUOTE(STRTTM))'
Они выдают дату и время запуска джоба.
Это можно и из msdb.dbo.sysjobactivity получить, только у ТС задача не просто запускать разные ветки в зависимости от шедурера, но и:
tunknown
По schedule0 job может выполняться долго и не успеет завершиться к заданному началу schedule1.

Нужно так: schedule0 в заданное время0, schedule1 всегда после schedule0, но не ранее времени1(позже можно), schedule2 регулярно в остальное время.
tunknown
Когда будут запущены schedule1 и schedule2 неизвестно, т.к. и schedule0 будет работать заранее неизвестное время. Не хочется делать отдельную таблицу, что schedule0 и schedule1 отработали по одному разу в указанные сутки. Любой вызов job может длиться неопределённое время, в т.ч. и по schedule2.

schedule0 запустить не ранее 0

schedule1 запустить не ранее 1, но позже отработавшего 0

schedule2 запускать во всё остальное время


Это всё напоминает вечный поиск начинающими программистами "универсального кода"

Типа, "Зачем делать разные процедуры с SELECT ... для разных таблиц, лучше сделать процедуру типа SELECT @ColumnNames from @tableName"
Или каждый MSSQL программист сразу пытается сделать "универсальный триггер логирования".

И тут похоже - я, конечно, не знаю бизнес-задачи, но подозреваю, что её можно реализовать более просто, и используя джобы и шедулеры по назначению (а не как ТС, который хочет использовать шедулер как джоб).
...
Рейтинг: 0 / 0
15.11.2019, 10:26
    #39889413
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
alexeyvg
не знаю бизнес-задачи, но подозреваю, что её можно реализовать более просто, и используя джобы и шедулеры по назначению (а не как ТС, который хочет использовать шедулер как джоб).

да собственно уже сказали - запуск каждые 5 минут, первым шагом проверка "что мы тут щас делать будем и по какой логике"
...
Рейтинг: 0 / 0
15.11.2019, 10:28
    #39889414
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
alexeyvg
Это можно и из msdb.dbo.sysjobactivity получить, только у ТС задача не просто запускать разные ветки в зависимости от шедурера
Запускать чуть разные. Отсюда и желание универсальности.

alexeyvg
Это всё напоминает вечный поиск начинающими программистами "универсального кода"
Верно.

alexeyvg
Или каждый MSSQL программист сразу пытается сделать "универсальный триггер логирования".
Done
...
Рейтинг: 0 / 0
15.11.2019, 11:12
    #39889436
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
StarikNavy
alexeyvg
не знаю бизнес-задачи, но подозреваю, что её можно реализовать более просто, и используя джобы и шедулеры по назначению (а не как ТС, который хочет использовать шедулер как джоб).

да собственно уже сказали - запуск каждые 5 минут, первым шагом проверка "что мы тут щас делать будем и по какой логике"
Не, это не бизнес-задача. Это какой бизнесмен-нефтяник, или маркетолог-ритэйлер, скажет, "а вот мне нужно, что бы пятый шаг джоба запускался по шедуреру №3"???

tunknown
alexeyvgИли каждый MSSQL программист сразу пытается сделать "универсальный триггер логирования".
Done Чутьё меня не подвело!
Ничего, с приходом опыта триггеры логирования будут переписаны, как и джобы :-)

tunknown
alexeyvgЭто можно и из msdb.dbo.sysjobactivity получить, только у ТС задача не просто запускать разные ветки в зависимости от шедурера
Запускать чуть разные. Отсюда и желание универсальности.Это часто очень правильно, лечше, чем копи-паст, но у вас уж больно запутанный подход.

Нужно как то ближе к бизнес-процессам, и менее универсально.

Задача инъекции функциональности джобов в шедулер, "в общем виде", слишком сложна, и стоимость такого решения будет завышенной для бизнеса, то есть его ценность только в интересе разработчика. Стоимость - включая расходы на трудовые ресурсы для эксплуатации решения.

А вот решить какую то бизнес задачу, не делая копи-паст джоба, намного проще.

Например, если джоб делает бакапы логов раз в полчаса, а один раз в сутки (в 3 ночи) он должен сделать ещё и полный бакап, то это решается проверкой в шаг полного бакапа пары условий (время больше 3х ночи, и в эти сутки ещё не было полного бакапа)
...
Рейтинг: 0 / 0
15.11.2019, 11:26
    #39889443
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
tunknown,

Убираете из основного задания все расписания.
Делаете задания-запускатели. По одному на каждое расписание.

Каждый запускатель сначала пытается получить эксклюзивный applock уровня сессии на общий ресурс.
Если не удалось, то запускатель завершается.
Иначе получает эксклюзивный applock уровня сессии на свой индивидуальный ресурс, запускает основное задание и ждет его завершения.

Основное задание в месте ветвления функцией applock_test проверяет может ли получить блокировку на индивидуальные ресурсы запускатель. Если не мождет - значит было запущено этим запускателем.
...
Рейтинг: 0 / 0
15.11.2019, 11:49
    #39889465
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
invm
tunknown,

Убираете из основного задания все расписания.
Делаете задания-запускатели. По одному на каждое расписание.

Каждый запускатель сначала пытается получить эксклюзивный applock уровня сессии на общий ресурс.
Если не удалось, то запускатель завершается.
Иначе получает эксклюзивный applock уровня сессии на свой индивидуальный ресурс, запускает основное задание и ждет его завершения.

Основное задание в месте ветвления функцией applock_test проверяет может ли получить блокировку на индивидуальные ресурсы запускатель. Если не мождет - значит было запущено этим запускателем.


И зачем этот геморрой в свете декларации

tunknown
Job должен выполняться строго последовательно, т.е. одновременный запуск не требуется.


?
...
Рейтинг: 0 / 0
15.11.2019, 11:54
    #39889467
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
aleks222,

Глазки протри (с)
...
Рейтинг: 0 / 0
19.11.2019, 17:26
    #39891239
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Job с несколькими schedule
invm
Убираете из основного задания все расписания.
Делаете задания-запускатели. По одному на каждое расписание.
Благодарю.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Job с несколькими schedule / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]