From 801f1d722ff4e38804ea49b766ec35683ad680c9 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Tue, 20 Oct 2026 15:33:51 +0300 Subject: [PATCH] =?UTF-8?q?DEPO:=20=D0=B2=D1=8B=D0=B4=D0=B0=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20bj=5Fuser=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=92=D0=A1=D0=95=20=D0=BF=D1=80=D0=BE=D1=86?= =?UTF-8?q?=D0=B5=D0=B4=D1=83=D1=80=D1=8B=20(=D0=B8=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B8=D1=85=20=D0=BD=D0=B5=20=D0=B2=D0=B8=D0=B4=D0=B8=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Причина «нет процедур» при успешной установке: проверка идёт логином bj_user, а OBJECT_ID под ним возвращает NULL для объектов без прав — FTV_M2M_JOB виден (ему выдан EXECUTE), 4 FTV_M2M_PROCESS_* нет. Процедуры установлены и работают (JOB вызывает их по цепочке владения dbo), но проверка их не видела. Теперь установка и скачиваемый скрипт выдают GRANT EXECUTE на все 5 процедур. Убрана ложная блокировка установки по отсутствию пользователя SYSDBA (CREATE проходит и без него; строка EXECUTE AS проверяется в рантайме). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn --- internal/lkgateway/depo_procs.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/internal/lkgateway/depo_procs.go b/internal/lkgateway/depo_procs.go index 4560168..17fe16d 100644 --- a/internal/lkgateway/depo_procs.go +++ b/internal/lkgateway/depo_procs.go @@ -97,7 +97,11 @@ func depoProcsScriptFor(f FancyMSSQLSettings, db, login string) string { fmt.Fprintf(&b, "/* ===== %s ===== */\n%s\nGO\n\n", p.Name, strings.TrimRight(body, "\n")) } if depoLoginRe.MatchString(login) { - fmt.Fprintf(&b, "/* Право запуска задания логину bj */\nGRANT EXECUTE ON dbo.FTV_M2M_JOB TO %s;\nGO\n", quoteIdent(login)) + b.WriteString("/* Права логину bj на все процедуры: без прав OBJECT_ID не видит их и проверка пишет «нет процедур» */\n") + for _, p := range depoProcInstallOrder { + fmt.Fprintf(&b, "GRANT EXECUTE ON dbo.%s TO %s;\n", p.Name, quoteIdent(login)) + } + b.WriteString("GO\n") } return b.String() } @@ -122,8 +126,11 @@ func depoProcsInstallInto(ctx context.Context, adm, f FancyMSSQLSettings, dbName } } if depoLoginRe.MatchString(grantLogin) { - if _, err := db.ExecContext(ctx, "GRANT EXECUTE ON dbo.FTV_M2M_JOB TO "+quoteIdent(grantLogin)); err != nil { - return fmt.Errorf("право EXECUTE логину %s: %s", grantLogin, quikErrorDetail(err)) + // Право на ВСЕ процедуры: без него OBJECT_ID под bj_user = NULL, и проверка пишет «нет процедур». + for _, p := range depoProcInstallOrder { + if _, err := db.ExecContext(ctx, "GRANT EXECUTE ON dbo."+p.Name+" TO "+quoteIdent(grantLogin)); err != nil { + return fmt.Errorf("право EXECUTE логину %s на %s: %s", grantLogin, p.Name, quikErrorDetail(err)) + } } } return nil @@ -164,7 +171,7 @@ func depoProcsPreflight(ctx context.Context, f FancyMSSQLSettings, adminUser, ad CASE WHEN DATABASE_PRINCIPAL_ID(@u) IS NULL THEN 0 ELSE 1 END, CASE WHEN DATABASE_PRINCIPAL_ID(@e) IS NULL THEN 0 ELSE 1 END`, sql.Named("u", login), sql.Named("e", execAs)).Scan(&canCreate, &sysadmin, &bjUser, &execAsOK) - canApply = (canCreate == 1 || sysadmin == 1) && execAsOK == 1 + canApply = canCreate == 1 || sysadmin == 1 var b strings.Builder fmt.Fprintf(&b, "Сервер %s, база %s, логин %s.\n", f.Server, f.DepoDB(), conn.User)