1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

MySQL-Trigger Drop Table on Delete

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von pschilling, 7. Dezember 2016.

  1. pschilling

    pschilling Erfahrenes Mitglied

    Hi zusammen,m

    ich habe eine Tabelle support_config in welcher unter anderem die Namen dynamisch generierter Tabellen gespeichert werden.


    Meine Frage:
    Ist es grundsätzlich möglich in einem Delete-Trigger ein drop table abzusetzen, so das die dynamisch generierten Tabellen mitgelöscht werden?

    Schönen Dank im voraus,
    Peter
     
  2. sheel

    sheel I love Asm Administrator

    Hi

    hab zwar keine Quelle, aber "warum nicht"? Geht es nicht?

    Würde aber empfehlen, die DB-Struktur zu überdenken. Dynamiche Spalten sind schon schlimm genug, dynamische Tabellen sind noch schrecklicher.
     
  3. pschilling

    pschilling Erfahrenes Mitglied

    Hallo Sheel,
    ich bekomme immer die Fehlermeldung:
    Error Code: 1422. Explicit or implicit commit is not allowed in stored function or trigger

    Anscheinend führt das drop table einen COMMIT durch?!


    Was genau findest du an dynamischen Tabellen bzw. Spalten so schrecklich?
    In meinem Anwendungsfall fand ich das den einzig praktikablen Weg. Da können sich die Anwender unter anderem ihre eigenen Erfassungsmasken samt Spalten, differenzierten Datentypen, Eingabehilfen und dergleichen gänzlich selbst definieren.
     
  4. Yaslaw

    Yaslaw n/a Moderator

    Ist der Delete-Trigger auf der zu löschenden Tabelle?

    Zeig doch mal etwasCode
     
  5. pschilling

    pschilling Erfahrenes Mitglied

    Hey Yaslaw,
    nein, der Delete-Trigger liegt auf der tabelle support_config.

    Und den Trigger kann ich erst gar nicht erstellen wegen der Fehlermeldung : Error Code: 1422. Explicit or implicit commit is not allowed in stored function or trigger
    Code (SQL):
    1. BEGIN
    2.   DROP TABLE support_config.table_De;
    3. END

    Ich habe es jetzt mal mit einer STORED PROCEDURE versucht. Allerdings löscht er mir die Tabelle mit dem übergebenen Namen immer noch nicht?!
    Code (SQL):
    1. CREATE DEFINER=`root`@`localhost` PROCEDURE `dropHelpTable`(IN `tableName` VARCHAR(32) CHARSET utf8)
    2.     MODIFIES SQL DATA
    3. BEGIN
    4.     DROP TABLE tableName;
    5.     commit;
    6. END
    Ich rufe die Procedur direkt im phpmyadmin auf.

    Wenn ich den Tabellennamen direkt angebe löscht er aber die Tabelle?! Wie muss ich denn den Variablennamen im Script verwenden?
    Code (SQL):
    1. CREATE DEFINER=`root`@`localhost` PROCEDURE `dropHelpTable`(IN `tableName` VARCHAR(32) CHARSET utf8)
    2.     MODIFIES SQL DATA
    3. BEGIN
    4.     DROP TABLE s30_de;
    5.     commit;
    6. END
     
    Zuletzt bearbeitet: 7. Dezember 2016
  6. pschilling

    pschilling Erfahrenes Mitglied

    Aber der Versuch mit der STORED PROCEDURE ist eh für die Katz da ich diese wegen des Commits ebenfalls nicht in einem DELETE-Trigger aufrufen kann :(

    Egal, dann schreib ich halt ein Script, was mir täglich die eventuell vorhandenen Tabellen-Leichen aufräumt :)
     
  7. Jan-Frederik Stieler

    Jan-Frederik Stieler Monsterator Moderator

    Hallo Peter,

    ich hab ja nicht soviel Ahnung von MySQL, aber müssen Variablen bei MYSQL nicht mit einem @ deklariert werden?

    Grüße
     
  8. pschilling

    pschilling Erfahrenes Mitglied

    Ja müssen Sie.
    Der phpMyAdmin erstellt auch folgenden Code wenn man die Prozedur dort aufruft:
    Code (SQL):
    1. SET @p0='''s29_de'''; CALL `dropHelpTable`(@p0);
    Aber wie gesagt, selbst wenn das drop table in der Prozedur funktionieren sollte kann ich diese wegen des Commits trotzdem nicht aus dem Delete-Trigger heraus aufrufen..
     
  9. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

  10. pschilling

    pschilling Erfahrenes Mitglied

    Hey Bratkartoffel (komisch, ich hab auf einmal Hunger :D )

    Ursprünglich wollte ich in einem DELETE-Trigger ein Drop Table absetzen. Das hab ich allerdings direkt verworfen, da mySQL in einem Trigger keine expliziten oder impliziten Commits zulässt..

    Dann dachte ich das ich ne Prozedur schreibe und diese dann in dem Delete-Trigger aufrufe. Hab ich aber auch mittlerweile aufgegeben weil, selbst wenn es funktionieren würde, mySQL das ebenfalls wegen des Commits nicht erlauben würde..

    Ich habe jetzt bereits ein php-Cleanup-Script geschrieben was mir die Tabellenleichen aufräumt :)

    Trotzdem danke für deine Mühe !
     
Die Seite wird geladen...