Учёт DEPO: задание SQL Server Agent — своё у каждой базы (bj2depo_<база>), имя в мастере

На одном сервере бывает несколько баз DEPO (боевая и тестовая): общее имя
bj2depo давало ложную зелёную проверку — тестовой базе засчитывалось боевое
задание, а своё не создавалось.
- Имя задания — настройка DepoJobName; в мастере, пункт 3, поле «Имя задания
  SQL Server Agent», по умолчанию bj2depo_<имя базы> (меняется вместе с базой,
  пока его не поправили). Установки старше — bj2depo, как было.
- Скрипт до любых изменений останавливается, если задание с этим именем
  обрабатывает другую базу или эту базу уже обрабатывает задание с другим именем
  (иначе двойная обработка событий).
- Проверка задания сравнивает его базу (sp_help_jobstep) с базой bj.
Синтаксис проверен на SQL Server без выполнения (SET PARSEONLY); проверка
задания на боевом сервере — зелёная (bj2depo ↔ BJ_DEPO_DATA).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-06 16:09:14 +03:00
parent 42524f6a4f
commit 21d87fb530
8 changed files with 135 additions and 25 deletions
+14 -4
View File
@@ -160,9 +160,9 @@ func (h *setupHandlers) wizardDepoJob(w http.ResponseWriter, r *http.Request) {
return
}
// джобы хранятся в msdb: при восстановлении базы DEPO из копии джоба остаётся — не пересоздаём
jobNote = "джоба " + depoJobName + " на сервере уже есть (bj её не пересоздавал). "
jobNote = "джоба " + depoJobName(h.rc.Snapshot().Fancy) + " на сервере уже есть (bj её не пересоздавал). "
} else {
jobNote = "джоба " + depoJobName + " создана. "
jobNote = "джоба " + depoJobName(h.rc.Snapshot().Fancy) + " создана. "
}
}
// проверяем запуск джобы (не процедуры): только что созданная джоба запускается в течение интервала — ждём
@@ -247,6 +247,16 @@ func (h *setupHandlers) depoSetupForm(r *http.Request) (FancyMSSQLSettings, stri
if !validDBName(db) {
return s, "", agent, "имя базы DEPO — только латинские буквы, цифры и _, начинается с буквы"
}
if agent { // задание обработки — своё у каждой базы: по умолчанию bj2depo_<база>
jn := strings.TrimSpace(r.FormValue("depo_job_name"))
if jn == "" {
jn = depoJobNameFor(db)
}
if !depoJobNameRe.MatchString(jn) {
return s, db, agent, "имя задания — латинские буквы, цифры, точка, дефис и _"
}
s.DepoJobName = jn
}
return s, db, agent, ""
}
@@ -396,7 +406,7 @@ func (h *setupHandlers) depoSetupDo(ctx context.Context, r *http.Request, step d
s.DepoTablesMode = "auto"
note = "база " + db + " подготовлена: логин " + s.User + ", таблицы обмена, права"
if agent {
note += ", задание " + depoJobName
note += ", задание " + depoJobName(s)
}
note += ". "
case "existing":
@@ -448,7 +458,7 @@ func (h *setupHandlers) depoSetupDo(ctx context.Context, r *http.Request, step d
step("tables", "ok", "")
// запуск обработки: только что созданное задание запускается в течение интервала — подождать
if agent {
step("job", "run", "Проверяю задание SQL Server Agent «"+depoJobName+"» — до 30 секунд")
step("job", "run", "Проверяю задание SQL Server Agent «"+depoJobName(s)+"» — до 30 секунд")
} else {
step("job", "run", "Проверяю, что bj может запускать обработку обмена")
}