Pflichtspalten und Backfills
Eine Spalte wird erst Pflicht, wenn keine Zeile mehr NULL enthält. Die Werte für bestehende Zeilen kommen aus einem Backfill, den du registrierst.
Erst nullable, NOT NULL nach dem Zählen
Eine neue Pflichtspalte in einer bestehenden Tabelle wird nullable angelegt. Pflicht wird sie mit SET NOT NULL, nachdem der Executor unter der Sperre gezählt hat, dass keine Zeile NULL enthält. Bleibt eine NULL, schlägt die Migration fehl und wird zurückgerollt.
Eine neue Pflichtspalte funktioniert also in einer leeren Tabelle, und eine Spalte wird Pflicht, sobald ihre Zeilen gefüllt sind. Optional wird sie wieder mit DROP NOT NULL; Primärschlüssel- und Identity-Spalten bleiben Pflicht.
Werte, die die Anwendung festlegt
Das Framework erfindet nie einen Wert. Ein Backfill nennt seine Zielspalte per ID, läuft, wenn die Spalte Pflicht wird, und füllt nur die NULLs.
Was ein Backfill verwenden darf
Konstanten sind immer JDBC-Parameter. Eine Konstante muss ohne Umwandlung oder Rundung in die Spalte passen, eine Quellspalte den Typ des Ziels haben oder Text für Text sein.
- BackfillValue.literal(value)
- Eine Konstante: Text, Zahlen, Boolean, UUID, Datums- und Zeittypen.
- BackfillValue.column(id)
- Eine andere Spalte derselben Zeile, per stabiler ID.
- BackfillValue.coalesce(values*)
- Der erste Wert, der nicht NULL ist.
- BackfillValue.concat(values*)
- Verketteter Text; NULL, wenn ein Teil NULL ist.
Einmal registriert, einmal ausgeführt
Ein Backfill wird mit der Prüfsumme seiner Definition in __hibernate_ddl.backfill_history eingetragen. Dieselbe ID mit anderer Definition blockiert den Start.
Sie laufen in ihrer Transaktion, während ihre Tabellen exklusiv gesperrt sind. Große Tabellen und Deployments ohne Ausfallzeit brauchen eine eigene, schrittweise Datenmigration.