SQLPackageInstallationPlugin: Deinstallation von Foreign Keys kann fehlschlagen

  • Affected App
    WoltLab Suite Core

    Hallo,


    die uninstall-Methode des SQLPackageInstallationPlugin kann unter Umständen bei der Deinstallation von Plugins Fehler verursachen. Es kann vorkommen, dass ein Index von der Datenbank entfernt wird (durch die Deinstallation), welcher für einen Foreign Key benötigt wird. Der Foreign Key gehört zwar zum gleichen Plugin und wird auch deinstalliert, allerdings hat die uninstall-Methode keine korrekte Sortierung, sodass es vorkommen kann, dass der Index vor dem Foreign Key entfernt werden soll, was zu einem MySQL Fehler führt.


    Ein minimales Beispiel Plugin besteht aus zwei Versionen. In der Version 1.0.0 wird eine Tabelle wcf1_test mit der Spalte testID int(10) angelegt. Mit dem Update auf Version 2.0.0 wird die Tabelle um einen Index auf testID und einem Foreign Key von testID nach wcf1_user.userID ergänzt. Deinstalliert man das Plugin nun, wird die uninstall-Methode zuerst den Index entfernen wollen, was den oben genannten Fehler verursacht.


    Der Fehler kann leicht behoben werden, indem zuerst alle Foreign Keys eines Plugins bei der Deinstallation entfernt werden und im Anschluss die Indices. Das ist leicht innerhalb der uninstall-Methode einzubauen, da Foreign Keys immer auf _fk enden und man diese dadurch ohne größeren Aufwand identifizieren kann.


    Im Anhang befindet sich das oben genannte Beispiel Plugin. Zuerst muss Version 1 v1.tar installiert werden und dann ein Update auf Version 2 v2.tar durchgeführt werden. Im Anschluss kann man die Deinstallation starten und bekommt die entsprechende Fehlermeldung.



    P.S.


    Der Fehler kann übrigens auch auftreten, wenn mehrere SQL Anweisungen in der Package XML stehen, beispielsweis


    XML
    <instructions type="install">
    	<instruction type="sql">sql/1.sql</instruction>
    	<instruction type="sql">sql/2.sql</instruction>
    </instructions>


    In 1.sql wird die Tabelle wcf1_test mit der Spalte testID int(10) angelegt. In 2.sql wird die Tabelle um einen Index auf testID und einem Foreign Key von testID nach wcf1_user.userID ergänzt.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!