Frage

Ich habe auf der Trigger-Seite erstellen  und ich möchte die Gemeinde fragen, ob die Empfehlungen gut sind und ob sie noch auf 5,1 anzuwenden. Was ich heute mit Triggern bemerkt zu spielen ist, dass es unmöglich ist, ein Feld in der alten Tabelle zu aktualisieren, einen AFTER UPDATE verwendet wird.

  1. Seien Sie vorsichtig mit BEFORE-Trigger. Einschränkungen auftreten können, insbesondere, wenn Sie InnoDB-Engine verwenden, wo ein Einsatz fehl, sondern aus Ihrem BEFORE-Trigger erfolgreich sein wird.
  2. verwenden, bevor löst in erster Linie für Beschränkungen oder Regeln, keine Transaktionen, die NEW zwicken. * Spalten in Ordnung sein sollte.
  3. Stick mit AFTER-Trigger für die meisten anderen Operationen, wie zum Beispiel in eine History-Tabelle einfügen oder eine Normalisierungs zu aktualisieren.
War es hilfreich?

Lösung

Ja. AFAIK, MySQL 5.1 hat noch keinen keine Änderungen an der Semantik, wie die Arbeit auslöst. MySQL versucht, die ANSI / ISO SQL-Spezifikation für Trigger-Semantik zu unterstützen.

Sie können sich vorstellen, eine Folge von Operationen gibt es die so läuft eine Zeile in die Datenbank geschrieben werden:

  1. Ausführen BEFORE-Trigger
  2. Einschränkungen auswerten, erzwingen NOT NULL gelten DEFAULT Werte
  3. Schreiben Sie die Zeile in die Datenbank
  4. Update-Indizes
  5. Ausführen AFTER-Trigger

Wenn Sie die AFTER-Trigger erreicht haben, ist es zu spät Werte in der Zeile zu ändern. In einigen Datenbanken können Sie NEW.somecolumn = 1234 gesetzt, aber diese Änderung wird verworfen leise wie der AFTER-Trigger beendet. In anderen Datenbanken, hilft es Ihnen, Ihre Fehler verstehen Sie einen Fehler, indem sie entweder, wenn Sie definieren den Auslöser oder beim Ausführen des Triggers.

AFTER-Trigger sind am besten für zusätzliche Aktionen verwendet als Folge der INSERT / UPDATE der Reihe zu nehmen, wie die Prüfung der Anmeldung Sie erwähnt. Für eine Sache, MySQL erlaubt nur einen Trigger pro Aktion pro Tisch, wenn Sie also auch Geschäftsregeln verwenden einen BEFORE-Trigger auf Werte zu ändern und durchzusetzen, jetzt können Sie zumindest die zusätzliche Aktionen in einem separaten Auslöser halten. Das macht es einfacher, das eine oder andere zu aktualisieren.

Die andere Überlegung ist, dass Sie wahrscheinlich zusätzliche Aktionen tun sollen erst nach Sie wissen, dass die Reihe erfolgreich gespeichert wurde. Z.B. es wäre eine Änderung einzuloggen ein BEFORE-Trigger nicht richtig sein, und dann die Änderung hat abbrechen wegen einer NOT NULL.

Für DELETE Aktionen, mit denen Sie abhängige Zeilen in anderen Tabellen entfernen müssen, können Sie noch zu tun haben, dass in einem BEFORE-Trigger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top