From cb047b93f6d45fc690eb2293777aeb9b26941220 Mon Sep 17 00:00:00 2001 From: zuevav Date: Mon, 5 Oct 2026 13:16:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D0=B0=20=D0=B8=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=86=20DEPO:=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7=D0=BA=D0=B0=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D1=8B=20=D0=BA=20=D0=BB=D0=BE=D0=B3=D0=B8?= =?UTF-8?q?=D0=BD=D1=83=20(ALTER=20USER=20=E2=80=A6=20WITH=20LOGIN),=20?= =?UTF-8?q?=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B1=D0=B0=D0=B7=D0=B0=20=D0=B2?= =?UTF-8?q?=D0=BE=D1=81=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BF=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=BB=D0=B8=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/depologin.go | 6 ++++++ internal/lkgateway/depologin_test.go | 2 +- internal/lkgateway/depotables.go | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/internal/lkgateway/depologin.go b/internal/lkgateway/depologin.go index fb83a56..5541eb8 100644 --- a/internal/lkgateway/depologin.go +++ b/internal/lkgateway/depologin.go @@ -61,6 +61,12 @@ GO IF USER_ID(N'%[2]s') IS NULL CREATE USER [%[2]s] FOR LOGIN [%[2]s]; GO +-- Пользователь базы мог остаться от прежнего логина (база восстановлена из копии с другого сервера +-- или логин пересоздан): привязываем его к текущему логину, иначе вход в базу не пройдёт. +IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name = N'%[2]s' AND sid <> SUSER_SID(N'%[2]s')) + ALTER USER [%[2]s] WITH LOGIN = [%[2]s]; +GO + IF IS_ROLEMEMBER(N'db_datareader', N'%[2]s') = 0 ALTER ROLE db_datareader ADD MEMBER [%[2]s]; GO `, db, login) diff --git a/internal/lkgateway/depologin_test.go b/internal/lkgateway/depologin_test.go index 9ecc94a..ff6fba3 100644 --- a/internal/lkgateway/depologin_test.go +++ b/internal/lkgateway/depologin_test.go @@ -7,7 +7,7 @@ import ( func TestDepoLoginScript(t *testing.T) { ms := depoLoginScript(false, "CLIENT_DEPO", "bj_svc") - for _, w := range []string{"CREATE LOGIN [bj_svc]", "USE [CLIENT_DEPO]", "CREATE USER [bj_svc] FOR LOGIN [bj_svc]", "db_datareader"} { + for _, w := range []string{"CREATE LOGIN [bj_svc]", "USE [CLIENT_DEPO]", "CREATE USER [bj_svc] FOR LOGIN [bj_svc]", "db_datareader", "ALTER USER [bj_svc] WITH LOGIN = [bj_svc]"} { if !strings.Contains(ms, w) { t.Fatalf("MS SQL: нет %q", w) } diff --git a/internal/lkgateway/depotables.go b/internal/lkgateway/depotables.go index dcff27b..892e945 100644 --- a/internal/lkgateway/depotables.go +++ b/internal/lkgateway/depotables.go @@ -233,6 +233,8 @@ func depoTablesGrantSQL(pg bool, user string) []string { } out := []string{ fmt.Sprintf("IF USER_ID(N'%[1]s') IS NULL CREATE USER [%[1]s] FOR LOGIN [%[1]s]", user), + // пользователь базы от прежнего логина (база восстановлена из копии / логин пересоздан) — перепривязать + fmt.Sprintf("IF EXISTS (SELECT 1 FROM sys.database_principals WHERE name = N'%[1]s' AND sid <> SUSER_SID(N'%[1]s')) ALTER USER [%[1]s] WITH LOGIN = [%[1]s]", user), // чтение учётных таблиц DEPO (лица, счета, остатки, опции) — для сверки заявок fmt.Sprintf("IF IS_ROLEMEMBER(N'db_datareader', N'%[1]s') = 0 ALTER ROLE db_datareader ADD MEMBER [%[1]s]", user), }