enhancement
major
minor
defect
critical
major
minor
major
#30184
DeleteTableProcessor entfernt keine <alternative>-Elemente aus dem gespeicherten Schema
Problem
Der DeleteTableProcessor (Tag <delete-table>, Paket com.top_logic.knowledge.service.migration) entfernt Tabellen aus dem gespeicherten Datenbankschema, löscht aber nur die Elemente <metaobject> und <association> (XPath //metaobject[...] | //association[...]). Ein <alternative>, das die gelöschte Tabelle als <specialisation> nennt, bleibt im gespeicherten Schema stehen und zeigt danach auf eine Tabelle, die es nicht mehr gibt.
Folge
Der Start der Anwendung bricht in MigrationService beim Aufbau des Typsystems ab:
UnknownTypeException: Unknown table 'Item', available tables are: ... at MOAlternativeImpl.resolve at DefaultMORepository.resolveReferences at MigrationService.createKB / MigrationContext.<init>
Die Meldung nennt weder die Alternative noch die Migration, die das Problem verursacht hat.
Beispiel
Das Schema deklariert:
<alternative object_name="FolderContent">
<specialisation name="Folder"/>
<specialisation name="Item"/>
</alternative>
Eine Migration löscht die Tabellen Folder und Item per <delete-table>. Das gespeicherte Schema enthält danach weiter die Alternative FolderContent.
Zweites Problem
Abstrakte Objekte ohne physische Tabelle lassen sich nicht mit <delete-table> entfernen: Der Prozessor führt für jedes gefundene Objekt DROP TABLE aus, und das scheitert, wenn es keine Tabelle gibt. Das Objekt bleibt im gespeicherten Schema stehen, und die Engine deklariert es beim Start in autoconf/inapp-schema-*.meta.xml neu.
Erwartetes Verhalten
- <delete-table> entfernt aus dem gespeicherten Schema auch <alternative>-Elemente, die nur noch gelöschte Tabellen enthalten, und streicht gelöschte Tabellen aus den <specialisation> übrig bleibender Alternativen.
- Für abstrakte Objekte ohne Tabelle wird kein DROP TABLE ausgeführt (oder es gibt einen Weg, sie aus dem Schema zu entfernen).
- Verbleibt trotzdem eine Referenz auf eine gelöschte Tabelle, nennt die Fehlermeldung die Alternative.
Workaround
Statt <delete-table> den RemoveApplicationTypesProcessor verwenden und darin neben den Tabellen auch die abstrakten Objekte und die betroffenen Alternativen als <application-table> aufführen:
{{{#!xml <processor class="com.top_logic.knowledge.service.migration.processors.RemoveApplicationTypesProcessor">
<application-tables>
<application-table name="Folder" db-name="FOLDER"/>
<application-table name="Item" db-name="ITEM"/>
<application-table name="FolderContent" db-name="FOLDER_CONTENT"/>
</application-tables>
</processor> }}}
- Der Prozessor entfernt alle genannten Einträge (auch <alternative>) aus dem gespeicherten Schema.
- Eine fehlende Tabelle (abstraktes Objekt, Alternative) führt beim Löschen nur zu einer Warnung, nicht zum Abbruch. db-name ist Pflicht, für diese Einträge genügt ein beliebiger Name.
- Bleibt eine Alternative bestehen, die eine gelöschte Tabelle neben anderen Tabellen nennt, muss die <specialisation> zusätzlich per XsltTableDefinitionBaselineProcessor (als Pre-Processor) aus dem gespeicherten Schema entfernt werden, vgl. Ticket_29019_Removed_log_entries.migration.xml.
Alternativ: Tabellen, die in einer <alternative> vorkommen, nicht löschen und ihre Deklaration behalten.