Parece ser uma duplicata de Jogar evoluções do framework 2.0 e criar gatilho (Observe que, na minha opinião, a melhor resposta é a postada por Roger em 24 de maio de 2013, ou seja, o link acima)
"delimiter" não pode ser usado no texto do script de evolução; Não consigo encontrar nenhuma documentação sobre por que isso é assim. Mas talvez tenha a ver com o fato de que "delimiter" não é uma instrução SQL, mas uma propriedade SQL.
No entanto, há uma solução na seção Evoluções dos documentos do Play 2 :
O Play divide seus arquivos .sql em uma série de instruções delimitadas por ponto e vírgula antes de executá-las uma a uma no banco de dados. Portanto, se você precisar usar um ponto e vírgula em uma instrução, faça escape digitando;; ao invés de;. Por exemplo, pontuação INSERT INTO(nome, caractere) VALUES ('ponto e vírgula', ';;');.
Então, no seu caso,
- Remova a propriedade "delimiter" e
- Use ";;" ao invés de ";" para o seu interior Instruções SQL, para evitar que o analisador Play 2 execute essas instruções SQL internas separadamente.
Aqui está um exemplo que testei com sucesso no Play 2.3 e no 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;
No caso do seu script SQL, o seguinte deve funcionar com o Play 2.1 e superior (observe que não testei):
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;