2016-04-25 5 views
0

Ist es möglich zu überprüfen, ob ein bestimmtes Feld in eine INSERT-Anweisung im Zusammenhang mit einem Auslöser enthalten war, den diese INSERT-Anweisung ausgelöst hat?So ermitteln Sie, ob ein Tabellenfeld in einen Insert-Trigger eingeschlossen wurde

Sagen Sie zum Beispiel, es gibt eine customers Tabelle mit den folgenden Feldern: customerid INT NOT NULL und isCrazy BIT(1) DEFAULT b'1'. Diese Tabelle hat einen Trigger vor dem Einfügen und es muss überprüft werden, ob die INSERT-Anweisung das Feld isCrazy enthält.

INSERT INTO customers (customerid) VALUES (1); 

ODER

INSERT INTO customers (customerid, isCrazy) VALUES (1, b'0'); 

Wenn das Feld definiert ist, dann sollte es gehen gespeichert werden, sonst gibt es bestimmte Maßnahmen ergriffen werden, um den richtigen Wert zu bestimmen, der in dieses Feld eingefügt werden soll; Das wäre nicht unbedingt der Standard.

Das Problem, das ich habe, ist, dass, wenn die isCrazy Feld wurde nicht in der INSERT-Anweisung enthalten, dann NEW.isCrazy hält den Standardwert (b'1 '); Das Gleiche, als ob der eingefügte Wert tatsächlich als solcher definiert wäre. Ist es möglich, die beiden Fälle auseinander zu halten?

+0

'OPTION' ist ein [reserviertes Schlüsselwort] (https://dev.mysql.com/doc/refman/5.7/en/keywords.html). Wenn Sie können, wählen Sie einen anderen Spaltennamen oder Sie müssen entfliehen Sie es jedes Mal. – tadman

+0

Ich weiß kein Ergebnis für Ihr Problem in einem Trigger. Sie können nur einen MaxScale-Proxy verwenden. das kann fast alles machen. Sie können die Anweisung darin analysieren und neu schreiben. siehe: https://mariadb.com/de/products/mariadb-maxscale –

+0

@tadman Die Spalte heißt eigentlich nicht "option", ich werde die Frage für Klarheit bearbeiten. – Ozzyberto

Antwort

1

Ich glaube nicht, gibt es eine explizite Möglichkeit zu sagen, ob der Wert explizit angegeben wurde oder aus einem Standard stammt.

Die einzige Option, die ich mir vorstellen kann, besteht darin, einen Standardwert zu verwenden, der niemals explizit vom Anwendungscode bereitgestellt werden sollte. Dann können Sie testen, ob NEW.option gleich ist; Wenn dies der Fall ist, lassen sie den Standardwert zu und der Auslöser kann ihn durch den ersetzen, den Sie wirklich als Standard verwenden möchten.

+0

Danke. Ich habe diese Lösung in Betracht gezogen, jedoch bedeutet das Implementieren dieser Änderung, alle anderen Einfügungen erneut zu überprüfen/zu testen; also versuche ich es zu vermeiden. – Ozzyberto

Verwandte Themen