Fehlerbehebung
Wichtig
#26808
Replaymigration mit H2 scheitert bei langen CLOB und BLOB Werten
Ähnlich dem Problem #26790 führt die Längenbeschränkung von Stringliteralen im H2-SQL-Dialekt dazu, dass ein bei der Replay-Migration erzeugter SQL-Dump nicht mehr eingespielt werden kann, wenn in den Daten lange CLOB oder BLOB Werte enthalten sind.
Das SQL wird zwar richtig erzeugt, beim Einspielen in das neue Schema fällt aber der Fehler Value too long for column "CHARACTER VARYING" und die Anwendung fährt nicht mehr hoch.
Analyse
Erzeugt man mit H2 einen Datenbank-Dump mit den eingebauten Tools, so wird das folgende Konstrukt verwendet, um lange CLOB und BLOB-Werte nach SQL zu exportieren:
CREATE CACHED LOCAL TEMPORARY TABLE IF NOT EXISTS SYSTEM_LOB_STREAM(ID INT NOT NULL, PART INT NOT NULL, CDATA VARCHAR, BDATA VARBINARY); ALTER TABLE SYSTEM_LOB_STREAM ADD CONSTRAINT SYSTEM_LOB_STREAM_PRIMARY_KEY PRIMARY KEY(ID, PART); CREATE ALIAS IF NOT EXISTS SYSTEM_COMBINE_CLOB FOR 'org.h2.command.dml.ScriptCommand.combineClob'; CREATE ALIAS IF NOT EXISTS SYSTEM_COMBINE_BLOB FOR 'org.h2.command.dml.ScriptCommand.combineBlob'; INSERT INTO SYSTEM_LOB_STREAM VALUES(4711, 0, "Long value part1", NULL); INSERT INTO SYSTEM_LOB_STREAM VALUES(4711, 1, "Long value part2", NULL); ... INSERT INTO "PUBLIC"."TL_PROPERTIES" VALUES (..., SYSTEM_COMBINE_CLOB(4711)); DROP TABLE IF EXISTS SYSTEM_LOB_STREAM; DROP ALIAS IF EXISTS SYSTEM_COMBINE_CLOB; DROP ALIAS IF EXISTS SYSTEM_COMBINE_BLOB;
Dasselbe Schema soll auch für den TopLogic-Dump verwendet werden.
Test
- test-app-rewrite aus #26798