Проблема
Ко мне обратился пользователь обновлятора с такой проблемой. У него на обслуживании много баз с доступом через сервис внешнего управления сеансами. И вот периодически через этот сервис пользователям временно ограничивается доступ к базе по той или иной причине (например, база на обслуживании или пользователь не оплатил услуги).
Обновлятор в этом случае тоже не может подключиться к базе и выдаёт ошибку при попытке выполнить по расписанию, например, архивацию или обновление. И вот было бы хорошо, чтобы обновлятор понимал, что эта ситуация с базой не ошибка, просто требуется временно пропускать любые операции с этой базой. Сейчас такая ситуация с базой приводит к ошибке и соответствующим уведомлениям администраторов, хотелось бы этого избежать.
Решение
Заходим в свойства базы, закладка "События", "Перед операцией". Из меню на панели скрипта выбираем пункт "обновлятор"-"методы"-"отменить операцию, если подключение к базе возвращает специальную ошибку".
В редактор вставится вот такая команда:
@cancel_if_error_connection_has( str: "#_база_на_обслуживании_#" ) |
Что делает эта команда? Она выполняет подключение к базе и если это подключение вернуло ошибку и в тексте этой ошибки содержится значение параметра str, то выполняется пропуск всей операции с базой:
Таким образом на стороне кода сервиса управления сеансами просто достаточно вернуть любое сообщение, содержащее (помимо прочего текста) в данном случае строку #_база_на_обслуживании_#
Вы можете сами придумать кодовую строку, важно лишь чтобы вероятность того, что эта строчка встретится случайно в реальном сообщении об ошибке подключения была крайне мала.
Можно за кодовую строку взять вообще значение guid, например a03bfd76-c093-47a7-8f15-2a3d1b1b758d. Такое значение точно случайно не повторится, но я за более говорящую кодовую строку, так как она в итоге попадает в статус пропуска операции и вы видите её в отчёте обновлятора.
Поэтому возможно имеет смысл завести сразу несколько кодовых строк, говорящих о причине блокировке базы. И далее передать эти значения в команду через запятую, например, вот так:
@cancel_if_error_connection_has( str: "#_база_на_обслуживании_#, #_не_оплачен_период_#, #_ещё_какая_нибудь_причина_#" ) |
И обновлятор последовательно переберет все варианты и в статус будет выведен именно тот, который сработал.