
# Skemavalidering

Når skemaer ændres mellem øjebliksbilleder (kolonner tilføjes, fjernes eller omdøbes), registrerer og rapporterer merql forskellene. Skemaforskelle blokerer ikke en merge, men vises, så den kaldende part kan beslutte, hvordan den vil fortsætte.

## Registrering

`SchemaValidator::validate()` sammenligner kolonnesættene for hver tabel på tværs af øjebliksbillederne for base, vores og deres. Den rapporterer:

- Kolonner tilføjet hos os (findes hos os, men ikke i grundlaget)
- Kolonner fjernet hos os (findes i grundlaget, men ikke hos os)
- Kolonner tilføjet hos dem
- Kolonner fjernet hos dem

```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"
    }
}
```

## Hvad registreres

| Ændring | Registreres | Bemærkninger |
|---|---|---|
| Kolonne tilføjet | Ja | Rapporteres for hver side (ours/theirs) |
| Kolonne fjernet | Ja | Rapporteres for hver side |
| Kolonnetype ændret | Nej | Typer gemmes, men sammenlignes ikke |
| Kolonne omdøbt | Nej | Vises som tilføjelse + fjernelse |
| Primærnøgle ændret | Nej | Identiteten fastlægges på snapshot-tidspunktet |

## Adfærd under sammenfletning

Når en kolonne findes i ét snapshot, men ikke i et andet, behandler sammenfletningen værdien for den manglende kolonne som `null`. Det betyder:

- En kolonne, der er tilføjet hos dem med en ikke-null-værdi, vises som `null -> value` (accepteres som deres ændring)
- En kolonne, der er fjernet hos dem, vises med `null` for alle rækker hos dem

Sammenfletningen fortsætter og giver et resultat. Skemaforskellene er kun til orientering. Kaldende kode bør kontrollere, at måldatabasens skema passer til de sammenflettede data, før de anvendes.

## Adgang til forskelle

Skemaforskelle er tilgængelige både på `ThreeWayMerge` (via `schemaMismatches()`) og på `MergeResult` (via `schemaMismatches()` og `hasSchemaMismatches()`). De bevares gennem `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
}
```
