Скрипты логина и таблиц DEPO: перепривязка пользователя базы к логину (ALTER USER … WITH LOGIN), если база восстановлена из копии или логин пересоздан
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -61,6 +61,12 @@ GO
|
|||||||
IF USER_ID(N'%[2]s') IS NULL CREATE USER [%[2]s] FOR LOGIN [%[2]s];
|
IF USER_ID(N'%[2]s') IS NULL CREATE USER [%[2]s] FOR LOGIN [%[2]s];
|
||||||
GO
|
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];
|
IF IS_ROLEMEMBER(N'db_datareader', N'%[2]s') = 0 ALTER ROLE db_datareader ADD MEMBER [%[2]s];
|
||||||
GO
|
GO
|
||||||
`, db, login)
|
`, db, login)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
|
|
||||||
func TestDepoLoginScript(t *testing.T) {
|
func TestDepoLoginScript(t *testing.T) {
|
||||||
ms := depoLoginScript(false, "CLIENT_DEPO", "bj_svc")
|
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) {
|
if !strings.Contains(ms, w) {
|
||||||
t.Fatalf("MS SQL: нет %q", w)
|
t.Fatalf("MS SQL: нет %q", w)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,6 +233,8 @@ func depoTablesGrantSQL(pg bool, user string) []string {
|
|||||||
}
|
}
|
||||||
out := []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 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 (лица, счета, остатки, опции) — для сверки заявок
|
// чтение учётных таблиц DEPO (лица, счета, остатки, опции) — для сверки заявок
|
||||||
fmt.Sprintf("IF IS_ROLEMEMBER(N'db_datareader', N'%[1]s') = 0 ALTER ROLE db_datareader ADD MEMBER [%[1]s]", user),
|
fmt.Sprintf("IF IS_ROLEMEMBER(N'db_datareader', N'%[1]s') = 0 ALTER ROLE db_datareader ADD MEMBER [%[1]s]", user),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user