Was ein Versionssprung an der Datenbank wirklich tut
Zwei parallel laufende Installationen, Schema gegen Schema: 23 neue Kerntabellen, 47 neue Spalten, drei entfallene und zwölf geänderte. Die gefährlichen sind nicht die neuen.
Ergebnis
23 neue Kerntabellen, 3 entfallene Spalten
Dazu 47 neue Spalten in bestehenden Tabellen und 12 Typänderungen. Keine Tabelle ist entfallen. Das Risiko für Integrationen liegt nicht bei den 23 neuen Tabellen — die stören niemanden —, sondern bei den drei entfallenen Spalten und vier Typänderungen, die aus einer erlaubten NULL eine Pflichtangabe machen.
Vor einem Versionssprung wird gefragt, wie groß er ist. Die Antworten sind meist qualitativ — „viel", „überschaubar", „größer als der letzte". Wir betreiben beide Linien parallel und konnten die Frage deshalb anders beantworten: Schema gegen Schema, Zeile für Zeile.
Die Zahlen
| 6.6.10.6 | 6.7.13.1 | |
|---|---|---|
| Tabellen | 246 | 275 |
| Spalten | 2.103 | 2.344 |
| neue Kerntabellen | 23 | |
| neue Spalten in bestehenden Tabellen | 47 | |
| entfallene Kernspalten | 3 | |
| Typänderungen | 12 | |
| entfallene Tabellen | 0 |
Die Bereinigung, ohne die die Zahl falsch wäre
Die beiden Runtimes tragen nicht denselben Pluginstand — 5 gegenüber 9 Erweiterungen. Roh gemessen ergab das 29 neue Tabellen. Sechs davon stammen aus Plugins und sind entfernt:
pixup_cheapest_price_cache · pixup_cheapest_price_cache_price ·
pixup_cheapest_price_product · pixup_cheapest_price_product_price ·
product_cheapest_price · rankpill_import
Bleiben 23 Kerntabellen. Die Zuordnung lief über die Herkunft der
CREATE TABLE-Anweisung: Liegt sie unter vendor/shopware/core/Migration, ist
es Kern; liegt sie unter custom/plugins, ist es ein Plugin.
Zweiundzwanzig der 23 stammen aus dem Migrationsverzeichnis V6_7, eine
(deleted_apps) aus V6_6 — sie kam in einem späteren 6.6-Patch, den die
gemessene 6.6.10.6 noch nicht hatte.
Die neuen Tabellen — und warum sie das kleinere Thema sind
Sie verteilen sich auf vier erkennbare Bereiche: eine Gruppe rund um
Maschinenschnittstellen für KI-Werkzeuge (app_mcp_*, mcp_tool_result_cache),
eine für Einwilligungen (consent_log, consent_state), eine für Webhooks
(webhook_delivery, webhook_stream) und eine für Maßeinheiten
(measurement_system*, measurement_display_unit*). Dazu Einzelstücke wie
document_file, theme_runtime_config, oauth_user und
sales_channel_tracking_*.
Neue Tabellen brechen nichts. Eine Integration, die sie nicht kennt, merkt nichts von ihnen. Sie sind interessant für die Frage, was Shopware vorhat — nicht für die Frage, was beim Update kaputtgeht.
Die drei entfallenen Spalten
Hier wird es ernst:
| Spalte | war in 6.6 |
|---|---|
customer.default_payment_method_id | binary(16) NOT NULL |
document.file_type | varchar(255) NOT NULL |
import_export_profile.name | varchar(255) NULL |
Die erste ist die folgenreichste. Ein System, das Kunden anlegt oder aktualisiert und dabei eine Standardzahlart mitschickt, schreibt ab 6.7 in ein Feld, das es nicht mehr gibt. Je nach Zugriffsweg endet das mit einem Fehler oder — unangenehmer — mit einem stillschweigend ignorierten Wert.
Die zwölf Typänderungen
Nicht alle sind gleich gefährlich. Sortiert nach Risiko:
Aus NULL wird Pflicht
| Spalte | 6.6 | 6.7 |
|---|---|---|
payment_method.technical_name | NULL erlaubt | NOT NULL |
shipping_method.technical_name | NULL erlaubt | NOT NULL |
import_export_profile.technical_name | NULL erlaubt | NOT NULL |
notification.message | NULL erlaubt | NOT NULL |
Das ist die Klasse, die schreibende Integrationen bricht. Wer eine Zahlart oder Versandart ohne technischen Namen anlegt, kam in 6.6 durch. In 6.7 nicht mehr. Der Code ist unverändert, das Verhalten nicht.
Zahlentypen
| Spalte | 6.6 | 6.7 |
|---|---|---|
order_delivery_position.total_price | int | double |
order_delivery_position.unit_price | int | double |
product.weight | decimal(10,3) | decimal(15,6) |
Der Wechsel von int auf double bei den Preisfeldern der Lieferposition ist
die auffälligste Änderung der Liste. Wer diese Spalten direkt ausliest — etwa
in einem Reporting neben Shopware — sollte den Typ nachziehen.
Das Gewicht bekommt mehr Nachkommastellen. Für ein System, das Gewichte zurückschreibt und dabei rundet, ändert sich die Erwartung.
Harmlose Verbreiterungen
customer_address.first_name und .last_name sowie die entsprechenden Felder
in order_address wachsen von 50 bzw. 60 auf 255 Zeichen;
product.display_group von 50 auf 64. Wer diese Felder in einem eigenen Schema
spiegelt, sollte nachziehen — kaputt geht dabei nichts.
Die 47 neuen Spalten, nach Tabelle
Die vollständige Verteilung, weil die Auswahl mehr sagt als die Summe:
| Tabelle | neue Spalten |
|---|---|
document_base_config | 9 — Seitenformat, Kopf-/Fußzeile, Anschrift, USt-ID, Seitenzahl |
order | 5 — internal_comment, primäre Lieferung, primäre Transaktion |
product | 4 — type, mainCategories, openGraphMedia, open_graph_media_id |
sales_channel | 3 — Zeitzone, Wartungs-Allowlist, Maßeinheiten |
product_translation | 3 — description_teaser, og_title, og_description |
app | 2 — context_gateway_url, requested_privileges |
product_export | 2 — provider, feed_label |
product_stream | 2 — internal, display_as_group |
sales_channel_analytics | 2 — Conversions, Offcanvas-Warenkorb |
state_machine_history | 2 — integration_id, internal_comment |
Dreizehn weitere Tabellen bekommen je eine Spalte dazu:
| Tabelle | neue Spalte |
|---|---|
custom_field | include_in_search |
custom_field_set | extension_name |
integration | mcp_allowlist |
user | mcp_allowlist |
language | active |
mail_template | was_modified_by_user |
media_thumbnail | media_thumbnail_size_id |
payment_token | consumed |
product_manufacturer_translation | link |
product_search_config_field | use_exact_subfield |
sales_channel_domain | measurement_units |
salutation | position |
webhook_event_log | sequence |
Drei davon sind eigene Themen wert:
product.type führt Produkttypen ein,
custom_field.include_in_search öffnet Custom Fields für die Suche, und die
primären Verweise am order ändern, wie Integrationen an Lieferung und
Transaktion kommen —
Die primäre Transaktion einer Bestellung.
Was aus diesem Delta nicht folgt
Der wichtigste Abschnitt, weil Schema-Vergleiche zum Überinterpretieren einladen:
Kein Zeitaufwand. Die Zahl der Änderungen sagt nichts darüber, wie lange ein Update dauert. Das hängt an der Datenmenge und an den Migrationen, nicht an der Zahl der Spalten.
Kein Risiko für Ihren Shop. Ob eine der drei entfallenen Spalten für Sie zählt, hängt ausschließlich daran, ob etwas darauf zugreift. Bei vielen Shops ist die Antwort nein.
Nichts über Erweiterungen. Ein Schema-Vergleich des Kerns sagt nichts darüber, ob Ihre Plugins mit 6.7 laufen. Das ist die eigentliche Arbeit eines Updates und eine andere Messung.
Nichts über das Verhalten. Eine Spalte existiert — gefüllt wird sie
deshalb noch lange nicht. Genau das ist bei den primären Verweisen am order
der Fall.
Kein durchgeführtes Update. Wir haben zwei Installationen verglichen, nicht eine aktualisiert. Ein echtes Update kann Zwischenzustände erzeugen, die hier nicht sichtbar sind.
Die Prüfliste, die daraus folgt
Wer von 6.6 auf 6.7 geht und Integrationen betreibt, prüft in dieser Reihenfolge:
- Schreibt etwas
customer.default_payment_method_id? Wenn ja, ist das der erste Fund. - Legt etwas Zahlarten, Versandarten oder Import-Profile an? Dann muss ab 6.7 ein technischer Name mitkommen.
- Liest etwas
order_delivery_positiondirekt aus? Typ vonintaufdoublenachziehen. - Spiegelt etwas Namensfelder in ein eigenes Schema? Feldlängen nachziehen.
- Schreibt etwas einen gelesenen Datensatz vollständig zurück? Dann trifft
es zusätzlich
description_teaser— das Feld ist neu und schreibgeschützt.
Punkt 5 hat uns in einem eigenen Projekt Credits gekostet, bevor es auffiel.
Ob der Wechsel für Sie ansteht, ist eine andere Frage als die nach dem Schema — sie steht in Auf Shopware 6.7 wechseln oder bei 6.6 bleiben. Wie wir solche Wechsel begleiten, gehört zu Shopware-Agentur.
