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

Откуда:
Сообщений: 717
Сейчас работает job с двумя schedule. Schedule1 на заданное время суток, schedule2- повторяющийся через небольшое время. В зависимости от schedule, по которому запустился job, в одном его шаге немного меняется логика. Другие шаги одинаковы. Конечно, вызов по повторяющемуся schedule2 может запоздать, тогда schedule1 будет проигнорирован. Но за счёт разнесения времени вызовов это пока работает. Теперь нужно добавить schedule0. Разнесение времени уже не поможет, т.к. длительность выполнения по этому schedule0 заранее не определена. Job должен выполняться строго последовательно, т.е. одновременный запуск не требуется. Как можно решить задачу в SQL Agent?

Не предлагать:
  • Пересоздание job
  • Ручное управление следующим schedule через "once time"
  • Зацикливание job с эмуляцией schedule
  • SSIS
  • CLR

    Разнесение в несколько job тоже нежелательно, т.к. разнородных шагов может быть много и дублировать их не хочется.
  • 14 ноя 19, 12:30    [22016088]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    1C Developer
    Member

    Откуда:
    Сообщений: 58
    Можно завести таблицу-семафор в которой фиксировать время старта/остановки заданий.

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

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

    Другой вариант пересмотреть логику исполнения - переделав все в одно задание.
    14 ноя 19, 13:00    [22016129]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 29808
    tunknown
    Теперь нужно добавить schedule0. Разнесение времени уже не поможет, т.к. длительность выполнения по этому schedule0 заранее не определена. Job должен выполняться строго последовательно, т.е. одновременный запуск не требуется. Как можно решить задачу в SQL Agent?
    Прочитал 3 раза, не понял, в чёт тут подвох?
    Для решения задачи нужно просто добавить schedule0.
    14 ноя 19, 13:28    [22016178]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    a_voronin
    Member

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

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

    Вообще в SSIS пакете у вас будет больше маневра. В том числе параллельность.
    14 ноя 19, 13:49    [22016222]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    aleks222
    Member

    Откуда:
    Сообщений: 769
    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. И фсе.
    14 ноя 19, 14:03    [22016242]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 717
    alexeyvg
    Прочитал 3 раза, не понял, в чёт тут подвох?
    Для решения задачи нужно просто добавить schedule0.
    Возможно, я не очень ясно написал. По schedule0 job может выполняться долго и не успеет завершиться к заданному началу schedule1.

    Нужно так: schedule0 в заданное время0, schedule1 всегда после schedule0, но не ранее времени1(позже можно), schedule2 регулярно в остальное время.
    14 ноя 19, 14:08    [22016249]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 717
    aleks222
    Нафига фсе эти чудеса с Schedule1-2-3?
    1. Одно расписание.
    2. Внутри проверять не "чем запущено", а "когда запущено".
    3. И фсе.
    Когда будут запущены schedule1 и schedule2 неизвестно, т.к. и schedule0 будет работать заранее неизвестное время. Не хочется делать отдельную таблицу, что schedule0 и schedule1 отработали по одному разу в указанные сутки. Любой вызов job может длиться неопределённое время, в т.ч. и по schedule2.

  • schedule0 запустить не ранее 0
  • schedule1 запустить не ранее 1, но позже отработавшего 0
  • schedule2 запускать во всё остальное время
  • 14 ноя 19, 14:17    [22016261]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 717
    a_voronin
    сохраняйте куда-то свои параметры и переходите не следующие шаги, где эти параметры читайте и используйте.
    Хотел использовать для этого результат xp_sqlagent_enum_jobs и msdb..sysschedules без дополнительных таблиц.
    14 ноя 19, 14:19    [22016267]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    Владислав Колосов
    Member

    Откуда:
    Сообщений: 7020
    tunknown,

    можно использовать sp_getaplock для выполнения взаимоисключающих бизнес-процессов. И разные джобы.
    14 ноя 19, 14:24    [22016274]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 717
    Владислав Колосов
    можно использовать sp_getaplock для выполнения взаимоисключающих бизнес-процессов. И разные джобы.
    Благодарю, надо подумать.
    14 ноя 19, 14:28    [22016284]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    aleks222
    Member

    Откуда:
    Сообщений: 769
    tunknown
    aleks222
    Нафига фсе эти чудеса с Schedule1-2-3?
    1. Одно расписание.
    2. Внутри проверять не "чем запущено", а "когда запущено".
    3. И фсе.
    Когда будут запущены schedule1 и schedule2 неизвестно, т.к. и schedule0 будет работать заранее неизвестное время. Не хочется делать отдельную таблицу, что schedule0 и schedule1 отработали по одному разу в указанные сутки. Любой вызов job может длиться неопределённое время, в т.ч. и по schedule2.

  • schedule0 запустить не ранее 0
  • schedule1 запустить не ранее 1, но позже отработавшего 0
  • schedule2 запускать во всё остальное время


  • Вам бы в управдомы переквалифицироваться.
    14 ноя 19, 15:54    [22016390]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    uaggster
    Member

    Откуда:
    Сообщений: 731
    Используйте в тексте джоба макроопределения '$(ESCAPE_SQUOTE(STRTDT))', '$(ESCAPE_SQUOTE(STRTTM))'
    Они выдают дату и время запуска джоба.
    Вот эта статья может пригодиться:
    https://www.mssqltips.com/sqlservertip/5731/how-to-pass-data-between-sql-server-agent-job-steps/
    15 ноя 19, 08:14    [22016723]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 29808
    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 программист сразу пытается сделать "универсальный триггер логирования".

    И тут похоже - я, конечно, не знаю бизнес-задачи, но подозреваю, что её можно реализовать более просто, и используя джобы и шедулеры по назначению (а не как ТС, который хочет использовать шедулер как джоб).
    15 ноя 19, 08:35    [22016732]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    StarikNavy
    Member

    Откуда: Москва
    Сообщений: 2299
    alexeyvg
    не знаю бизнес-задачи, но подозреваю, что её можно реализовать более просто, и используя джобы и шедулеры по назначению (а не как ТС, который хочет использовать шедулер как джоб).

    да собственно уже сказали - запуск каждые 5 минут, первым шагом проверка "что мы тут щас делать будем и по какой логике"
    15 ноя 19, 10:26    [22016851]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    tunknown
    Member

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

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

    alexeyvg
    Или каждый MSSQL программист сразу пытается сделать "универсальный триггер логирования".
    Done
    15 ноя 19, 10:28    [22016853]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 29808
    StarikNavy
    alexeyvg
    не знаю бизнес-задачи, но подозреваю, что её можно реализовать более просто, и используя джобы и шедулеры по назначению (а не как ТС, который хочет использовать шедулер как джоб).

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

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

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

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

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

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

    Например, если джоб делает бакапы логов раз в полчаса, а один раз в сутки (в 3 ночи) он должен сделать ещё и полный бакап, то это решается проверкой в шаг полного бакапа пары условий (время больше 3х ночи, и в эти сутки ещё не было полного бакапа)
    15 ноя 19, 11:12    [22016898]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    invm
    Member

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

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

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

    Основное задание в месте ветвления функцией applock_test проверяет может ли получить блокировку на индивидуальные ресурсы запускатель. Если не мождет - значит было запущено этим запускателем.
    15 ноя 19, 11:26    [22016914]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    aleks222
    Member

    Откуда:
    Сообщений: 769
    invm
    tunknown,

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

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

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


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

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


    ?
    15 ноя 19, 11:49    [22016949]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    invm
    Member

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

    Глазки протри (с)
    15 ноя 19, 11:54    [22016954]     Ответить | Цитировать Сообщить модератору
     Re: Job с несколькими schedule  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 717
    invm
    Убираете из основного задания все расписания.
    Делаете задания-запускатели. По одному на каждое расписание.
    Благодарю.
    19 ноя 19, 17:26    [22019893]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить