MySQL TRIGGER bei Insert ausführen?

Hallo zusammen.

Ich habe mal eine Frage.

Besteht die Möglichkeit auf einer MySQL Datenbank einen TRIGGER zu generieren, der bei dem Insert in eine bestimmte Tabelle denselben Insert noch in eine andere Tabelle durchführt.

Zur Erläuterung,
Wir haben ein Forum in dem es virtuelles Geld gibt.
Da es aber User gibt, die ihren virtuellen Kontoauszügen nicht glauben, brauchen wir ein Log aller Transaktionen.
Es existiert bereits eine Logtabelle. Aus dieser Tabelle werden die Kontoauszüge generiert. Jedoch haben die User die Möglichkeit die älteren Auszüge zusammenzufassen. Leider verschwinden die Transaktionen dabei auch aus der bestehenden Log Tabelle.
An der Stelle möchte ich halt gern Vorbeugen.
Und sobald eine Transaktion abgeschlossen ist, diese ebenfalls in eine separate Logtabelle schreiben, diese hat dann nichts mit den Auszügen der User zutun und es ist möglich alle Buchungen nachzuvollziehen.

Daher:
Ist es möglich bei einem Insert in Tabelle A dieselben Werte in Tabelle B zuschreiben ohne alle Insertstatements anpassen oder überarbeiten zu müssen?

Für Ideen wäre ich sehr dankbar.

LG
Markus

Hallo Markus,

das hier sollte die richtige Frage auf deine Antwort sein:

http://dev.mysql.com/doc/refman/5.1/de/create-trigge…

(sogar auf deutsch :smiley:)

Selber gemacht hab ich sowas noch nicht, aber es scheint mir sehr ausführlich darüber dokumentiert zu sein.

MfG, Florian J.

(PS: Ich hab einfach mal „MySQL Trigger“ in meine Adressleiste eingegeben, was so ziemlich einer Google-Suche gleichkommt.)

Also, wenn ich mich recht erinnere - und ich hab das echt lange nicht mehr gemacht, dann muss man bei CREATE ein wenig aufpassen, sonst bekommt man doppelte Log-Einträge.
Grundsätzlich ist das ohne weiteres möglich, sofern Ihr eine etwas modernere MySQL-Version habt.
Mit
CREATE TRIGGER testref AFTER INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
kriegt man sowas hin. Dabei beachten: NEW bezeichnet die neue Zeile, AFTER INSERT bezeichnet den Zeitpunkt, an dem der Trigger ausgelöst werden soll.
Welche sonstigen Ereigniss zur Verfügung stehen, kriegst Du bei Herrn Google mit den Stichworten „MySQL Trigger“, dann landest Du sofort in den (deutschsprachigen) Manpages.
Gruß
Erntehelfer

Hallo Markus,

bisher habe ich Trigger nur bei Oracle verwendet.
Aber eigtl sollten die MySQL-Trigger fast genauso funktionieren. Unter Oracle gab es Variablen, die die einzutragenden Werte enthielten.
Somit sollte es dann auch möglich sein, diese in eine zweite Tabelle zu „loggen“.

Habe leider momentan keine Zeit das selbst zu testen.
Aber
http://dev.mysql.com/doc/refman/5.1/de/create-trigge…
wäre wahrscheinlich ein guter Anfang.

Ich hatte einen Trigger zusammengebaut, der das jetzt hätte erledigen sollen.

CREATE TRIGGER hist_guthaben_trans AFTER INSERT ON guthaben_log
FOR EACH ROW BEGIN
INSERT INTO hist_guthaben_log SET
logID = NEW.logID,
userID = NEW.userID,
langvar = NEW.langvar,
text = NEW.text,
link = NEW.link,
guthaben = NEW.guthaben,
time = NEW.time
;
END;

nur leider hat mir da wohl unser Hoster einen Riegel vorgeschoben. Ich kann mit unserem DB-User keinen Trigger anlegen. Da werde ich morgen wohl ersteinmal nachhaken müssen ob sie uns das Recht noch geben.

Aber generell sollte das so doch funktionieren oder?

LG
Markus

Hallo Markus,

das ähnelt dem, was ich von Oracle kenne sehr.
Einen konkreten Fehler sehe ich jetzt so nicht.

Werden dann beim Zusammenfassen der Log-Tabelle wirklich Einträge gelöscht?
Evtl. könnte man da auch mit Views arbeiten, um die Kontoauszüge anzuzeigen.

Gruß
Thomas

Trigger werden in der Dokumentation von MySQL beschrieben.

Einzelheiten kannst du hier finden: http://dev.mysql.com/doc/refman/5.1/de/create-trigge…

Ich empfehle, die Rechte für den Trigger-User zu beachten.

Grüße,

Alexander

Leider werden die Einträge wirklich gelöscht.

Da mir die Rechte fehlen um einen Trigger anlegen zu können, hab ich jetzt einfach das Insert Statement dupliziert. Ich lasse jetzt also zu der bisherigen Log Tabelle noch in die Historien Log Tabelle schreiben. Da aus dieser nichts gelöscht wird kann ich die Daten dann ohne weiteres verarbeiten.

Trotzdem vielen Dank für die Unterstützung.
Markus

Hallo Markus,

erstmal sorry für die späte Antwort, war ein paar Tagen hier nicht mehr drin (viel Arbeit).

Generell ist sowas möglich. Allerdings sollte 1. es vermieden werden 2 Aktionen in einem Querry auszuführen und 2. sollten nicht 2 Inserts in einem Querry ausgeführt werden. Select Anweisungen kann man noch 1 Auge zu drücken, aber bei Inserts sollte dies vermieden werden, da sowas ein bischen Triggy ist und auch Fehleranfällig.
Grund: Bei einem größerem Projekt, wie das deine, sollet man darauf achten, dass man nicht mehrere Aktionen gleichzeitig macht, da ansonsten später die Fehleranalyse wesentlich schwerer ist. Sollte es mal ein Problem geben, existieren ja SQL Logs, wenn man dann jede Aktion einzeln hat, kann man wesentlich einfach und vor allem auch schneller erkennen, wo das Problem liegt. Wenn man allerdings jetzt 2 oder mehrere Aktionen in einem Querry durchjagt, wird auch das Debuggen bei eventuellen Problemem wesentich aufwendiger. Wenn du also einmal einen Wert in Tabelle A und dann nochmal den selben Wert in Tabelle B schreiben willst, dann mach daraus 2 Querrys.
Ist meine Empfehlung

Denn, wenn bei einer verschachtelten Select Anweisung mal in einem Profil der Vorname fehlt und beim 2ten Aufruf er da ist (weil bei dem Select Befehl was schief lief, wie z.B. to many connections oder ähnliches) dann ist das noch lange nicht so schlimm, als wenn bei einer verschachtelten Insert Anweisung ein Insert nicht ausgeführt wurde.

Gruß
Prahkael

Hallo Prahkael,

so habe ich es jetzt auch gelöst.
Da ich eh keine Möglichleit hatte den Trigger anzulegen, habe ich das Insertstatement dupliziert.
Die Bedenken dabei sind nur, dass diese Änderungen nach Updates der Plugins wieder verschwunden sind.
Das wollte ich halt durch den DB Seitigen Trigger unterbinden.

Trotzdem vielen Dank für die Informationen.
Das die Aktion mit dem Trigger so riskant ist, hätte ich nicht gedacht.

Gruß
Markus

sorry, kann im moment leider nicht weiterhelfen.

cu
harald
***************