Anzeige

 MySQL-Trigger Drop Table on Delete

pschilling

Erfahrenes Mitglied
#1
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
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.
 

pschilling

Erfahrenes Mitglied
#3
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.
 

pschilling

Erfahrenes Mitglied
#5
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
SQL:
BEGIN
  drop table support_config.table_De;
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?!
SQL:
CREATE DEFINER=`root`@`localhost` PROCEDURE `dropHelpTable`(IN `tableName` VARCHAR(32) CHARSET utf8)
    MODIFIES SQL DATA
BEGIN
    drop TABLE tableName;
    commit;
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?
SQL:
CREATE DEFINER=`root`@`localhost` PROCEDURE `dropHelpTable`(IN `tableName` VARCHAR(32) CHARSET utf8)
    MODIFIES SQL DATA
BEGIN
    drop TABLE s30_de;
    commit;
END
 
Zuletzt bearbeitet:

pschilling

Erfahrenes Mitglied
#6
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 :)
 

pschilling

Erfahrenes Mitglied
#8
Ja müssen Sie.
Der phpMyAdmin erstellt auch folgenden Code wenn man die Prozedur dort aufruft:
SQL:
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..
 

pschilling

Erfahrenes Mitglied
#10
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 !
 
Anzeige

Neue Beiträge

Anzeige