
# Validering av schema

När scheman förändras mellan ögonblicksbilder (kolumner läggs till, tas bort eller byter namn) upptäcker merql skillnaderna och rapporterar dem. Schemaavvikelser blockerar inte sammanslagningen, men de visas så att anroparen kan avgöra hur den ska gå vidare.

## Identifiering

`SchemaValidator::validate()` jämför kolumnuppsättningarna för varje tabell i ögonblicksbilderna base, ours och theirs. Den rapporterar:

- Kolumner som lagts till i ours (finns i ours men inte i base)
- Kolumner som tagits bort i ours (finns i base men inte i ours)
- Kolumner som lagts till i theirs
- Kolumner som tagits bort i theirs

```php
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}
```

## Vad som identifieras

| Ändring | Identifieras | Anteckningar |
|---|---|---|
| Kolumn tillagd | Ja | Rapporteras per sida (ours/theirs) |
| Kolumn borttagen | Ja | Rapporteras per sida |
| Kolumntyp ändrad | Nej | Typer lagras men jämförs inte |
| Kolumn har bytt namn | Nej | Visas som tillägg + borttagning |
| Primärnyckel ändrad | Nej | Identiteten fastställs när ögonblicksbilden skapas |

## Beteende vid sammanslagning

När en kolumn finns i en ögonblicksbild men saknas i en annan behandlar sammanslagningen det saknade kolumnvärdet som `null`. Det innebär att:

- En kolumn som lagts till i theirs med ett värde som inte är null visas som `null -> value` (accepteras som deras ändring)
- En kolumn som tagits bort i theirs visas som om den hade `null` för alla rader i theirs

Sammanslagningen fortsätter och ger ett resultat. Schemaavvikelserna är endast informativa. Anroparen bör kontrollera att måldatabasens schema överensstämmer med de sammanslagna uppgifterna innan de tillämpas.

## Åtkomst till avvikelser

Schemaavvikelser finns både på `ThreeWayMerge` (via `schemaMismatches()`) och på `MergeResult` (via `schemaMismatches()` och `hasSchemaMismatches()`). De bevaras genom `ConflictResolver::resolve()`.

```php
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}
```
