enhancement
major
minor
defect
critical
major
minor
major
#30119
AlterColumnProcessor aktualisiert das gespeicherte Schema für abstrakte Typen nicht
Wenn „alter-column“ auf eine abstrakte Tabelle abzielt (z. B. „epp.plan.SimpleObject“), ändert der Prozessor zwar korrekt die DB-Spalten aller konkreten Untertypen über „adjustTable()“, versäumt es jedoch, das gespeicherte Schema für den abstrakten Typ zu aktualisieren.
**Grundursache:** In ` AlterColumnProcessor.doMigration()` werden abstrakte Typen in der Schleife übersprungen (Zeile 154). Die Liste `tablesWithDeclaredAttribute` erfasst nur konkrete Typen, bei denen `hasDeclaredAttribute()` wahr ist (Zeile 170). Wenn eine Spalte in einem abstrakten Typ deklariert ist und alle konkreten Untertypen diese lediglich erben, ist `tablesWithDeclaredAttribute` leer und `adjustStoredSchema()` nimmt keine Aktualisierungen vor.
**Auswirkung:** Nachfolgende Prozessoren, die `context.getPersistentRepository() ` auslesen (z. B. ` RecollateStringColumnsProcessor`), sehen weiterhin den alten Spaltentyp aus dem gespeicherten Schema. In unserem Fall führte dies zum Scheitern der TL8-Migration, da der „RecollateStringColumnsProcessor“ für CLOB-Spalten „ALTER COLUMN TYPE VARCHAR(4000) COLLATE „tl_ci“ anstelle von ALTER COLUMN TYPE TEXT COLLATE „tl_ci“ für CLOB-Spalten generierte, was bei Daten mit mehr als 4000 Zeichen zu einem Fehler führte.
**Vorgeschlagene Korrektur:** Füge nach der for-Schleife in doMigration() (nach Zeile 173) die angegebene Tabelle zu `tablesWithDeclaredAttribute` hinzu, wenn sie die Spalte deklariert, aber nicht verarbeitet wurde (weil sie abstrakt ist):
// Die angegebene Tabelle einbeziehen, wenn sie die Spalte deklariert, aber nicht verarbeitet wurde
// (z. B. weil sie abstrakt ist und in der obigen Schleife übersprungen wurde).
if (!tablesWithDeclaredAttribute.contains(tableName)
&& abstractTable.hasDeclaredAttribute(columnName)) {
tablesWithDeclaredAttribute.add(tableName);
}
**Datei:** com.top_logic/src/main/java/com/top_logic/knowledge/service/db2/migration/AlterColumnProcessor.java
**Workaround:** Ein separater `MigrationProcessor`, der das persistente Schema lädt, den korrekten `DBType` für die Spalte des abstrakten Typs festlegt und diese über `AddMOAttributeProcessor.updateStoredSchema()` wieder speichert.