# Przyczyna i naprawa — Baltique OS 2.7.0.1

## Przyczyna

Wersja 2.6.2.1 utworzyła tabelę `enterprise_site_consolidation_runs` z kolumnami m.in.:

```text
version
canonical_site_key
candidates_found
aliases_migrated
duplicate_rows_removed
hospital_sites_archived
details_json
run_by_user_id
created_at
```

Wersja 2.7.0 oczekiwała nowszego kontraktu, m.in.:

```text
run_key
status
canonical_location_id
source_signature_before
source_signature_after
moved_references
merged_rows
deleted_duplicates
warnings_json
started_at
completed_at
created_by_user_id
```

Kod 2.7.0 wykonywał `CREATE TABLE IF NOT EXISTS`. Ponieważ tabela już istniała, MySQL nie zmienił jej struktury. Następny `INSERT` odwoływał się do `run_key`, co powodowało błąd 1054.

Dodatkowo starsza tabela `enterprise_site_aliases` nie posiadała `alias_type` i `metadata_json`, co spowodowałoby kolejny błąd po naprawieniu samego `run_key`.

## Naprawa

2.7.0.1:

1. odczytuje aktualny schemat przez `INFORMATION_SCHEMA`;
2. dodaje wyłącznie brakujące kolumny;
3. zachowuje stare kolumny i rekordy;
4. nadaje historycznym runom klucze `legacy-site-<id>`;
5. uzupełnia znaczniki czasu i właściciela z pól 2.6.2.1;
6. tworzy indeksy wymagane przez 2.7.0;
7. naprawia tabelę runów unifikacji po częściowo przerwanym upgrade;
8. uruchamia bazowy release 2.7.0 dopiero po potwierdzeniu zgodności schematu;
9. ponownie sprawdza schemat po zakończeniu;
10. rejestruje migrację `245_1_core_2_7_0_1_run_key_schema_repair`.

## Dodatkowa naprawa

Poprawiono wywołanie `balt078_register_migration()` w bazowym release 2.7.0. Wcześniej argument opisu był przekazywany jako status migracji, co po usunięciu błędu `run_key` mogło wywołać kolejny problem.

## Idempotencja

Naprawa może być wykonana ponownie. Każdy `ALTER` jest poprzedzony kontrolą istnienia kolumny lub indeksu. Historyczne runy są uzupełniane tylko wtedy, gdy `run_key` jest pusty.
