MySQL Trigger: Update auf gleiche Tabelle

MasterDS

Erfahrenes Mitglied
Hallo zusammen.

Ich stehe vor einem Problem mit einem Trigger, den ich gern einsetzen würde. Bzw. ist mir eigentlich egal ob es ein Trigger oder eine Procedure macht.

Szenario:
Tabelle Preis / Felder Preisgruppe, ArtikelID, Preis, Pseudopreis
Die Tabelle hat für jede ArtikelID drei Zeilen mit jeweils unterschiedlicher Preisgruppe

Ziel:
Ich möchte einen Trigger (o.ä.) der mir beim Update einer Zeile aus Preisgruppe X den dortigen Preis in eine andere Zeile der Tabelle mit Preisgruppe Y in das Feld Peudopreis schreibt (beide mit identischer ArtikelID).

Versucht habe ich soetwas als Trigger auf Tabelle Preis:
SQL:
FOR EACH ROW BEGIN
IF NEW.preisgruppe = "RM" AND OLD.preis <> NEW.preis THEN

UPDATE PREISE p SET p.pseudopreis = NEW.preis
  WHERE artikelID =OLD.artikelID
  AND preisgruppe = "H";
END IF;
END
Lässt sich zwar speichern, aber bei einem Update kommt das der mySQL Fehler 14442 - ist verboten.

Ich habe keine Ahnung wie ich dieses Szenario abseits dieser Beschränkung umsetzen soll. (Ohne z.b. ein PHP Skript zu programmieren, dass zeitgesteuert immer wieder über die Tabelle läuft und diese Änderungen vornimmt. Mit einer Stored Procedure die als Parameter die ArtikelID und den neuen Preis annimmt, klappt es ebenso nicht.

Jemand eine elegante Idee?

Grüße
masterd
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Ist wieder Murks.
Jetzt ist dein SQL-Statement im WHERE-Teil ohne Tabellen-Alias

EDIT: Was den Fehler 1442 betrifft: Du versuchst die Tabelle zu ändern, welche selbst durch deine User-Aktion bereits geändert wird! In einem übertragenen Sinne: Rekursion.
BTW: Ist das ein AFTER UPDATE-Trigger? Alle Hinweise/Lösungen, diesen Fehler zu beheben, gehen auf einen BEFORE-Trigger

EDIT2: Nach weiterer Recherche bin ich zu folgendem Schluss gekommen: MySQL erlaubt keine rekursiven Trigger (a.k.a Trigger, welche die Tabelle ändern, für welche der Trigger ursprünglich aufgerufen worden ist). Basta!
Auf Deutsch: Du musst es aus dem Frontend-Code selbst machen

EDIT3: Das einzige was mir noch einfällt (ungetestet), wäre ein "Kreisverkehr", falls du es partout über Trigger lösen willst: Du hast noch eine zusätzliche "Schattentabelle" (Kopie von "Preise").
Dein jetziger Trigger updatet die Schattentabelle, und die Schattentabelle hat selbst einen Trigger, welcher wiederum deine "Original"-Tabelle updatet. Musst halt dafür sorgen, dass wenn der "Kreisverkehr" am Ende ankommt, keine Aktion durchgeführt wird.
 
Zuletzt bearbeitet:

Neue Beiträge