DEPO: справочник участников снова записывается на бою; GUID событий — NULL
На 9 (FTV_DE_DATA) FTV_M2M_EVENTS.GUID NOT NULL (создано bj раньше), событие HANDBOOK без GUID падало и откатывало всю транзакцию — справочник в DEPO не обновлялся (с 11:50 при каждом справочнике). Теперь справочник пишется в своей транзакции, событие — отдельно (не записалось — предупреждение). Структура: GUID в FTV_M2M_EVENTS — NULL (как на тесте с 12.10); для существующих таблиц — ALTER COLUMN в наборе скриптов с правами администратора (плашка обновления, скрипт .sql). Проверено на тесте (BJ2_DEPO_DATA, транзакция с откатом). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -87,9 +87,20 @@ func depoProcOrderText(sep string) string {
|
||||
return strings.Join(parts, sep)
|
||||
}
|
||||
|
||||
// depoSchemaFixes — правки структуры трансферных таблиц, которые логин bj сделать не может (нужны права
|
||||
// администратора БД); выполняются вместе с процедурами. Повторный запуск безопасен.
|
||||
var depoSchemaFixes = []struct{ Name, SQL string }{
|
||||
// 22.10.2026: служебные события (HANDBOOK) — без GUID; в таблицах, созданных bj до этого, GUID NOT NULL
|
||||
{"FTV_M2M_EVENTS.GUID NULL", `IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id=OBJECT_ID(N'dbo.FTV_M2M_EVENTS') AND name=N'GUID' AND is_nullable=0)
|
||||
ALTER TABLE dbo.FTV_M2M_EVENTS ALTER COLUMN GUID uniqueidentifier NULL`},
|
||||
}
|
||||
|
||||
// depoProcsHash — отпечаток набора процедур, который bj установит (с учётом правки под клиента).
|
||||
func depoProcsHash(f FancyMSSQLSettings) string {
|
||||
h := sha256.New()
|
||||
for _, fx := range depoSchemaFixes {
|
||||
h.Write([]byte(fx.Name + "\n" + fx.SQL + "\n"))
|
||||
}
|
||||
for _, p := range depoProcInstallOrder {
|
||||
h.Write([]byte(p.Name + "\n" + strings.TrimSpace(depoProcEffective(f, p.Name)) + "\n"))
|
||||
}
|
||||
@@ -125,6 +136,9 @@ func depoProcsScriptFor(f FancyMSSQLSettings, db, login string) string {
|
||||
b.WriteString(" Порядок " + depoProcOrderText(" -> ") + ". Запуск под sysadmin в SSMS.\n")
|
||||
b.WriteString(" CREATE OR ALTER — повторный запуск безопасен (данные не меняются). */\n")
|
||||
fmt.Fprintf(&b, "USE %s;\nGO\n\n", quoteIdent(db))
|
||||
for _, fx := range depoSchemaFixes {
|
||||
fmt.Fprintf(&b, "/* ===== структура: %s ===== */\n%s;\nGO\n\n", fx.Name, fx.SQL)
|
||||
}
|
||||
for _, p := range depoProcInstallOrder {
|
||||
body := depoProcEffective(f, p.Name)
|
||||
if strings.TrimSpace(body) == "" {
|
||||
@@ -150,6 +164,11 @@ func depoProcsInstallInto(ctx context.Context, adm, f FancyMSSQLSettings, dbName
|
||||
return err
|
||||
}
|
||||
defer db.Close()
|
||||
for _, fx := range depoSchemaFixes {
|
||||
if _, err := db.ExecContext(ctx, fx.SQL); err != nil {
|
||||
return fmt.Errorf("структура таблиц (%s): %s", fx.Name, quikErrorDetail(err))
|
||||
}
|
||||
}
|
||||
for _, p := range depoProcInstallOrder {
|
||||
body := depoProcEffective(f, p.Name)
|
||||
if strings.TrimSpace(body) == "" {
|
||||
|
||||
Reference in New Issue
Block a user