Dies scheint ein Duplikat von Play framework 2.0 evolutions and create trigger zu sein (Beachten Sie, dass meiner Meinung nach die bessere Antwort die von Roger am 24. Mai 2013 gepostete ist, dh der Link oben)
„Trennzeichen“ kann nicht im Text des Evolutionsskripts verwendet werden; Ich kann anscheinend keine Dokumentation finden, warum dies so ist. Aber vielleicht hat es damit zu tun, dass "delimiter" kein SQL-Statement, sondern eine SQL-Property ist.
Es gibt jedoch eine Lösung im Evolutions-Abschnitt der Play 2-Dokumentation :
Play teilt Ihre .sql-Dateien in eine Reihe von durch Semikolons getrennten Anweisungen auf, bevor sie einzeln gegen die Datenbank ausgeführt werden. Wenn Sie also innerhalb einer Anweisung ein Semikolon verwenden müssen, maskieren Sie es, indem Sie;; Anstatt von;. Beispiel:INSERT INTO Interpunktion(Name, Zeichen) VALUES ('Semikolon', ';;');.
Also in Ihrem Fall
- Entfernen Sie die Eigenschaft "delimiter" und
- Verwenden Sie ";;" Anstatt von ";" für Ihr Inneres SQL-Anweisungen, um zu verhindern, dass der Play 2-Parser diese inneren SQL-Anweisungen separat ausführt.
Hier ist ein Beispiel, das ich erfolgreich in Play 2.3 und mysql 14.14 Distrib 5.5.40 (Ubuntu 12.04LTS) getestet habe:
DROP TRIGGER IF EXISTS SOFTWARE_INSERT_CT_TRIGGER;
CREATE TRIGGER SOFTWARE_INSERT_CT_TRIGGER
BEFORE INSERT ON SOFTWARE
FOR EACH ROW
BEGIN
IF NEW.CREATED_TIME = '0000-00-00 00:00:00' THEN
SET NEW.CREATED_TIME = NOW();;
END IF;;
END;
Im Fall Ihres SQL-Skripts sollte Folgendes mit Play 2.1 und höher funktionieren (beachten Sie, dass ich es nicht getestet habe):
DROP TRIGGER IF EXISTS invoice_line_insert;
CREATE TRIGGER invoice_line_insert AFTER INSERT
ON invoice_line FOR EACH ROW
BEGIN
IF NEW.type = "DELIVERY" THEN
UPDATE invoice
SET invoice.etdelivery_amount = invoice.etdelivery_amount + NEW.amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
ELSE
UPDATE invoice
SET invoice.etexpense_amount = invoice.etexpense_amount + NEW.amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
END IF;;
UPDATE invoice
SET invoice.vatamount = (NEW.amount * ((
SELECT vat.rate
FROM vat
WHERE vat.id_vat = NEW.vat_id_vat
) / 100)) + invoice.vatamount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
UPDATE invoice
SET invoice.itamount = invoice.vatamount +
invoice.etdelivery_amount +
invoice.etexpense_amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
END;