
# Schema-Validierung

Wenn sich Schemas zwischen Snapshots weiterentwickeln (Spalten hinzugefügt, entfernt oder umbenannt werden), erkennt merql diese Unterschiede und meldet sie. Schemaabweichungen verhindern den Merge nicht, werden aber angezeigt, damit der Aufrufer entscheiden kann, wie er vorgeht.

## Erkennung

`SchemaValidator::validate()` vergleicht die Spaltenmengen jeder Tabelle in den Snapshots von Basis, uns und ihnen. Gemeldet werden:

- Bei uns hinzugefügte Spalten (in unserem Snapshot, aber nicht in der Basis vorhanden)
- Bei uns entfernte Spalten (in der Basis vorhanden, aber nicht in unserem Snapshot)
- Bei ihnen hinzugefügte Spalten
- Bei ihnen entfernte Spalten

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

## Erkannte Änderungen

| Änderung | Erkannt | Hinweise |
|---|---|---|
| Spalte hinzugefügt | Ja | Wird pro Seite gemeldet (uns/sie) |
| Spalte entfernt | Ja | Wird pro Seite gemeldet |
| Spaltentyp geändert | Nein | Typen werden gespeichert, aber nicht verglichen |
| Spalte umbenannt | Nein | Erscheint als Hinzufügen und Entfernen |
| Primärschlüssel geändert | Nein | Identität wird beim Erstellen des Snapshots festgelegt |

## Verhalten beim Merge

Wenn eine Spalte in einem Snapshot vorhanden ist, in einem anderen jedoch nicht, behandelt der Merge den fehlenden Spaltenwert als `null`. Das bedeutet:

- Eine bei ihnen hinzugefügte Spalte mit einem Wert ungleich null erscheint als `null -> value` (wird als ihre Änderung übernommen)
- Eine bei ihnen entfernte Spalte gilt für alle Zeilen in ihrem Snapshot als mit `null` versehen

Der Merge wird ausgeführt und liefert ein Ergebnis. Schemaabweichungen dienen nur zur Information. Der Aufrufer sollte vor der Anwendung prüfen, ob das Schema der Zieldatenbank zu den zusammengeführten Daten passt.

## Abweichungen abrufen

Schemaabweichungen sind sowohl in `ThreeWayMerge` (über `schemaMismatches()`) als auch in `MergeResult` (über `schemaMismatches()` und `hasSchemaMismatches()`) verfügbar. Sie bleiben über `ConflictResolver::resolve()` hinweg erhalten.

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