Questo sembra essere un duplicato di Riproduci le evoluzioni del framework 2.0 e crea un trigger (Nota che, a mio avviso, la risposta migliore è quella postata da Roger il 24 maggio 2013, ovvero il link sopra)
"delimitatore" non può essere utilizzato nel testo dello script di evoluzione; Non riesco a trovare alcuna documentazione sul motivo per cui è così. Ma forse ha a che fare con il fatto che "delimiter" non è un'istruzione SQL ma una proprietà SQL.
Tuttavia, c'è una soluzione nella sezione Evoluzioni dei documenti di Play 2 :
Play divide i tuoi file .sql in una serie di istruzioni delimitate da punto e virgola prima di eseguirle una alla volta sul database. Quindi, se è necessario utilizzare un punto e virgola all'interno di un'istruzione, esegui l'escape inserendo;; invece di;. Ad esempio, INSERT INTO punteggiatura(nome, carattere) VALUES ('punto e virgola', ';;');.
Quindi nel tuo caso,
- Rimuovi la proprietà "delimiter" e
- Usa ";;" invece di ";" per il tuo interno istruzioni SQL, in modo da impedire al parser di Play 2 di eseguire separatamente queste istruzioni SQL interne.
Ecco un esempio che ho testato con successo in Play 2.3 e mysql 14.14 Distrib 5.5.40 (Ubuntu 12.04LTS):
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;
Nel caso del tuo script SQL, quanto segue dovrebbe funzionare con Play 2.1 e versioni successive (nota che non l'ho testato):
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;