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)