trigger
before the update
Wie kann ich einen Fehler auslösen, der die Aktualisierung dieser Tabelle verhindert, wenn ich eine in einer Tabelle habe?
173
Hier ist ein Hack , der funktionieren kann. Es ist nicht sauber, aber es sieht so aus, als würde es funktionieren:
Im Wesentlichen versuchen Sie nur, eine nicht vorhandene Spalte zu aktualisieren.
Ab MySQL 5.5 können Sie mithilfe der
SIGNAL
Syntax eine Ausnahme auslösen :Der Status 45000 ist ein generischer Status, der "nicht behandelte benutzerdefinierte Ausnahme" darstellt.
Hier ist ein vollständigeres Beispiel für den Ansatz:
quelle
Leider funktioniert die Antwort von @RuiDC in MySQL-Versionen vor 5.5 nicht, da SIGNAL für gespeicherte Prozeduren nicht implementiert ist.
Die Lösung, die ich gefunden habe , besteht darin, ein Signal zu simulieren, das einen
table_name doesn't exist
Fehler auslöst, und eine angepasste Fehlermeldung in das zu sendentable_name
.Der Hack kann mithilfe von Triggern oder einer gespeicherten Prozedur implementiert werden. Ich beschreibe beide Optionen im Folgenden anhand des von @RuiDC verwendeten Beispiels.
Trigger verwenden
Verwenden einer gespeicherten Prozedur
Mit gespeicherten Prozeduren können Sie dynamisches SQL verwenden, wodurch die Fehlergenerierungsfunktionalität in einer Prozedur zusammengefasst wird. Der Kontrapunkt ist, dass wir die Einfüge- / Aktualisierungsmethoden der Anwendungen steuern sollten, damit sie nur unsere gespeicherte Prozedur verwenden (ohne INSERT / UPDATE direkte Berechtigungen zu gewähren).
quelle
Das folgende Verfahren ist (auf mysql5) eine Möglichkeit, benutzerdefinierte Fehler auszulösen und gleichzeitig zu protokollieren:
quelle
quelle
Eine andere (Hack-) Methode (wenn Sie aus irgendeinem Grund nicht auf 5.5+ sind), die Sie verwenden können:
Wenn Sie ein erforderliches Feld haben, setzen Sie das erforderliche Feld innerhalb eines Triggers auf einen ungültigen Wert wie NULL. Dies funktioniert sowohl für INSERT als auch für UPDATE. Beachten Sie, dass dieser Ansatz nicht funktioniert, wenn NULL ein gültiger Wert für das erforderliche Feld ist (aus irgendeinem verrückten Grund).
Wenn Sie mit 5.5+ arbeiten, können Sie den Signalstatus wie in anderen Antworten beschrieben verwenden:
quelle
quelle