DEPO: выдавать bj_user право на ВСЕ процедуры (иначе проверка их не видит)

Причина «нет процедур» при успешной установке: проверка идёт логином 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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-20 15:33:51 +03:00
parent bf26495b6f
commit 801f1d722f
+11 -4
View File
@@ -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)