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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user