Мастер, обработка DEPO: скрипт джобы SQL Agent для администратора (пояснения, повторный запуск безопасен, скачивание), подсказка у варианта с логином sa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -754,6 +754,32 @@ EXEC dbo.sp_add_jobschedule @job_name = N'%[1]s', @name = N'%[1]s', @enabled = 1
|
||||
EXEC dbo.sp_add_jobserver @job_name = N'%[1]s';`, depoJobName, f.DepoDB(), depoJobProcName(f), depoJobEvery(f))
|
||||
}
|
||||
|
||||
// depoJobAgentAdminScript — тот же набор для администратора SQL (вариант «создаёт администратор по
|
||||
// скрипту»): с пояснениями и защитой от повторного запуска (джоба уже есть — ничего не делает).
|
||||
// depoJobAgentScript остаётся построчным: его выполняет сам bj в варианте «джобу создаёт bj».
|
||||
func depoJobAgentAdminScript(f FancyMSSQLSettings) string {
|
||||
return fmt.Sprintf(`-- Bridge&Join: джоба SQL Server Agent «%[1]s» — обработка таблиц обмена M2M в базе %[2]s.
|
||||
-- Каждые %[4]d с вызывает процедуру %[3]s: записи bj превращаются в документы и операции учёта DEPO.
|
||||
-- Выполнить в SSMS или sqlcmd под логином с правами sysadmin (или SQLAgentOperatorRole в msdb).
|
||||
-- Служба SQL Server Agent должна быть запущена. Скрипт можно запускать повторно: если джоба уже есть, он её не трогает.
|
||||
|
||||
USE msdb;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM msdb.dbo.sysjobs WHERE name = N'%[1]s')
|
||||
BEGIN
|
||||
EXEC dbo.sp_add_job @job_name = N'%[1]s', @enabled = 1, @description = N'bj2depo: обработка трансферных таблиц M2M (bj)';
|
||||
EXEC dbo.sp_add_jobstep @job_name = N'%[1]s', @step_name = N'%[1]s', @subsystem = N'TSQL', @database_name = N'%[2]s', @command = N'exec %[3]s;';
|
||||
EXEC dbo.sp_add_jobschedule @job_name = N'%[1]s', @name = N'%[1]s', @enabled = 1, @freq_type = 4, @freq_interval = 1, @freq_subday_type = 2, @freq_subday_interval = %[4]d, @active_start_time = 0;
|
||||
EXEC dbo.sp_add_jobserver @job_name = N'%[1]s';
|
||||
PRINT N'Джоба %[1]s создана.';
|
||||
END
|
||||
ELSE
|
||||
PRINT N'Джоба %[1]s уже есть — не изменялась.';
|
||||
GO
|
||||
`, depoJobName, f.DepoDB(), depoJobProcName(f), depoJobEvery(f))
|
||||
}
|
||||
|
||||
// depoJobGrantScript — права для варианта «внутри bj».
|
||||
func depoJobGrantScript(f FancyMSSQLSettings) string {
|
||||
return fmt.Sprintf("USE %s;\nGRANT EXECUTE ON %s TO %s;", f.DepoDB(), depoJobProcName(f), f.User)
|
||||
@@ -872,11 +898,12 @@ func depoJobCreateAgent(ctx context.Context, rc *RuntimeConfig, adminUser, admin
|
||||
// DepoJobView — данные карточки «Где запускается обработка».
|
||||
type DepoJobView struct {
|
||||
Name, Proc, GrantScript, AgentRights, AgentScript string
|
||||
AdminScript string // для администратора: с пояснениями и защитой от повтора
|
||||
Every int
|
||||
}
|
||||
|
||||
func depoJobView(f FancyMSSQLSettings) DepoJobView {
|
||||
return DepoJobView{Name: depoJobName, Proc: depoJobProcName(f), Every: depoJobEvery(f), GrantScript: depoJobGrantScript(f), AgentRights: depoJobAgentRightsScript(f), AgentScript: depoJobAgentScript(f)}
|
||||
return DepoJobView{Name: depoJobName, Proc: depoJobProcName(f), Every: depoJobEvery(f), GrantScript: depoJobGrantScript(f), AgentRights: depoJobAgentRightsScript(f), AgentScript: depoJobAgentScript(f), AdminScript: depoJobAgentAdminScript(f)}
|
||||
}
|
||||
|
||||
// ---- выгрузка истории тестов (TEST3, банк Зенит / робот) в трансферные таблицы ----
|
||||
|
||||
@@ -25,6 +25,7 @@ func (h *setupHandlers) registerFancy(mux *http.ServeMux) {
|
||||
mux.HandleFunc("/admin/setup/fancy/depo-tables/check", h.checkFancyDepoTables)
|
||||
mux.HandleFunc("/admin/setup/fancy/depo-tables/script.sql", h.fancyDepoTablesScript)
|
||||
mux.HandleFunc("/admin/setup/fancy/depo-login/script.sql", h.fancyDepoLoginScript)
|
||||
mux.HandleFunc("/admin/setup/fancy/depo-job/script.sql", h.fancyDepoJobScript)
|
||||
mux.HandleFunc("/admin/fancy-queue", h.fancyQueue)
|
||||
mux.HandleFunc("/admin/fancy-queue/requeue", h.fancyQueueRequeue)
|
||||
}
|
||||
@@ -321,3 +322,11 @@ func fancyDBLabel(s FancyMSSQLSettings) string {
|
||||
}
|
||||
return "MSSQL"
|
||||
}
|
||||
|
||||
// fancyDepoJobScript — GET /admin/setup/fancy/depo-job/script.sql: скрипт джобы SQL Agent для администратора.
|
||||
func (h *setupHandlers) fancyDepoJobScript(w http.ResponseWriter, r *http.Request) {
|
||||
s := h.rc.Snapshot().Fancy
|
||||
w.Header().Set("Content-Type", "application/sql; charset=utf-8")
|
||||
w.Header().Set("Content-Disposition", `attachment; filename="bj-depo-job-mssql.sql"`)
|
||||
_, _ = w.Write([]byte("\uFEFF" + depoJobAgentAdminScript(s))) // SSMS без BOM читает кириллицу как ANSI
|
||||
}
|
||||
|
||||
@@ -190,14 +190,17 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); }
|
||||
<input type="text" name="admin_user" autocomplete="off" placeholder="логин администратора SQL, например sa" style="padding:8px;width:100%;background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:4px">
|
||||
<input type="password" name="admin_password" autocomplete="new-password" placeholder="пароль" style="padding:8px;width:100%;background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:4px">
|
||||
</div>
|
||||
<p id="wiz-job-auto-hint" class="muted" style="font-size:12.5px;margin:-4px 0 0">Нет логина администратора SQL или его не хотят давать — выберите ниже «Джоба SQL Server Agent, создаёт администратор по скрипту»: тот же результат, скрипт выполняет администратор.</p>
|
||||
<div id="wiz-job-bj" style="display:none"><p style="margin:0 0 4px;font-size:13px"><b>Администратору SQL — выполнить один раз:</b></p><pre class="copyable" style="font-size:12px">{{.DepoJob.GrantScript}}</pre></div>
|
||||
<div id="wiz-job-manual" style="display:none"><p style="margin:0 0 4px;font-size:13px"><b>Скрипт для администратора SQL:</b></p><pre class="copyable" style="font-size:12px;max-height:260px;overflow:auto">{{.DepoJob.AgentScript}}</pre></div>
|
||||
<div id="wiz-job-manual" style="display:none"><p style="margin:0 0 4px;font-size:13px"><b>Скрипт для администратора SQL</b> — выполнить один раз под sysadmin, затем нажать «Проверить и далее». Повторный запуск безопасен.</p>
|
||||
<a href="/admin/setup/fancy/depo-job/script.sql">Скачать скрипт bj-depo-job-mssql.sql</a>
|
||||
<pre class="copyable" style="font-size:12px;max-height:260px">{{.DepoJob.AdminScript}}</pre></div>
|
||||
<input type="hidden" name="action" value="" id="wiz-job-action">
|
||||
<div style="display:flex;justify-content:space-between;margin-top:6px"><a href="/admin/wizard?step=3&sub=tables" class="btn" style="background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8);text-decoration:none">← Назад</a><button type="submit" class="btn" id="wiz-job-btn">Создать, проверить и далее →</button></div>
|
||||
<p class="muted" style="font-size:12px;margin:0">Проверка: bj кладёт служебное событие и ждёт до 40 секунд, пока обработка его отметит.</p>
|
||||
</form>
|
||||
<script>function wizJob(){var f=document.getElementById('wiz-job'),m=f.depo_job_mode.value;
|
||||
document.getElementById('wiz-job-auto').style.display=m==='sql-auto'?'grid':'none';document.getElementById('wiz-job-bj').style.display=m==='bj'?'block':'none';document.getElementById('wiz-job-manual').style.display=m==='sql-manual'?'block':'none';
|
||||
document.getElementById('wiz-job-auto').style.display=m==='sql-auto'?'grid':'none';document.getElementById('wiz-job-auto-hint').style.display=m==='sql-auto'?'block':'none';document.getElementById('wiz-job-bj').style.display=m==='bj'?'block':'none';document.getElementById('wiz-job-manual').style.display=m==='sql-manual'?'block':'none';
|
||||
document.getElementById('wiz-job-action').value=m==='sql-auto'?'':'check';document.getElementById('wiz-job-btn').textContent=m==='sql-auto'?'Создать, проверить и далее →':'Проверить и далее →';}wizJob();</script>
|
||||
|
||||
{{else if eq $sub "done"}}
|
||||
|
||||
@@ -99,7 +99,8 @@
|
||||
<pre class="copyable">{{.DepoJob.AgentRights}}</pre></details>
|
||||
{{else if eq .Settings.Fancy.DepoJobMode "sql-manual"}}
|
||||
<div style="margin-top:12px"><b>Инструкция для администратора SQL клиента</b> — создать джобу (SQL Agent должен быть запущен, служебная учётная запись Agent должна иметь право выполнять процедуру):
|
||||
<pre class="copyable">{{.DepoJob.AgentScript}}</pre></div>
|
||||
<a href="/admin/setup/fancy/depo-job/script.sql">Скачать скрипт bj-depo-job-mssql.sql</a>
|
||||
<pre class="copyable">{{.DepoJob.AdminScript}}</pre></div>
|
||||
{{end}}
|
||||
|
||||
{{if .Settings.Fancy.DepoJobMode}}
|
||||
|
||||
Reference in New Issue
Block a user